Этот вопрос почти отвечает тому, что я хочу знать: возможно ли назвать функции C в PHP в программе на C?
Конечно, вы можете вызывать функции PHP из C, если вы скомпилируете исходный код PHP с вашей программой. Но можно ли вызывать рабочую среду PHP из программы C без этого, как библиотеки?
Изменить: я загрузил исходный код PHP и скомпилировал его. Попробует связать объектные файлы с моим собственным кодом и посмотреть, могу ли я назвать это из LLVM-генерируемого IR.
Вы можете, но это не очень хорошая идея. Вы видите, что php-функции предназначены для использования php-скриптами, с их собственными структурами данных и управлением памятью, а не напрямую C. Там LOT, и я имею в виду LOT макросов и синтаксического сахара, чтобы просто показать функцию парсер. например:
ZEND_FUNCTION(func_num_args)
{
zend_execute_data *ex = EX(prev_execute_data);
if (!(ZEND_CALL_INFO(ex) & ZEND_CALL_CODE)) {
RETURN_LONG(ZEND_CALL_NUM_ARGS(ex));
} else {
zend_error(E_WARNING, "func_num_args(): Called from the global scope - no function context");
RETURN_LONG(-1);
}
}
Эти макросы и вспомогательные функции охватывают весь интерпретатор, и вам нужно сделать много шаблонов инициализации, прежде чем использовать его, даже как разделяемую библиотеку (например, что такое контекст функции?).
Простая strlen
выглядит
ZEND_FUNCTION(strlen)
{
zend_string *s;
#ifndef FAST_ZPP
if (zend_parse_parameters(ZEND_NUM_ARGS(), "S", &s) == FAILURE) {
return;
}
#else
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_STR(s)
ZEND_PARSE_PARAMETERS_END();
#endif
RETVAL_LONG(ZSTR_LEN(s));
}
Вы ДОЛЖНЫ использовать zend_string вместо ac string. И вы можете иметь то же самое в C только с
size_t strlen(const char *str);
Если вы хотите использовать функции php в своем приложении, разумной альтернативой является просто использовать встроенный php-интерпретатор, такой как https://github.com/symisc/PH7 (немного заброшенный, но все же PHP 5.3) и, конечно же, запустить php-код,
Перефразируя доктора Иана Малкома: Вы были настолько озабочены тем, могли ли вы это сделать, вы не переставали думать, если вы