Этот вопрос почти отвечает тому, что я хочу знать: Можно ли вызывать C-функции PHP в C-программе?
Конечно, вы можете вызывать PHP-функции из C, если вы компилируете исходный код PHP с вашей программой. Но можно ли вызвать среду выполнения PHP из программы на C без этого как библиотеку?
редактироватьЯ скачал исходный код PHP и скомпилировал его. Постараюсь связать объектные файлы с моим собственным кодом и посмотреть, смогу ли я вызвать его из сгенерированного LLVM IR.
Можно, но это не очень хорошая идея. Видите ли, функции php предназначены для использования сценариями php с их собственными структурами данных и управлением памятью, а не напрямую с помощью C. Есть много, и я имею в виду много макросов и синтаксического сахара, чтобы показать функцию парсер. например:
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 вместо C строка. И вы можете иметь то же самое в C только
size_t strlen(const char *str);
Если вы хотите использовать функции php в своем приложении, разумной альтернативой является просто использование встроенного интерпретатора php, подобного этому https://github.com/symisc/PH7 (немного заброшенный, но все еще PHP 5.3) и, конечно, запустить PHP-код.
Перефразируя доктора Яна Малкома: Вы были так озабочены тем, могли ли вы, или нет, вы не переставали думать, стоит ли вам
Других решений пока нет …