Вызовите функции времени выполнения PHP как связанную библиотеку из C

Этот вопрос почти отвечает тому, что я хочу знать: Можно ли вызывать C-функции PHP в C-программе?

Конечно, вы можете вызывать PHP-функции из C, если вы компилируете исходный код PHP с вашей программой. Но можно ли вызвать среду выполнения PHP из программы на C без этого как библиотеку?

редактироватьЯ скачал исходный код PHP и скомпилировал его. Постараюсь связать объектные файлы с моим собственным кодом и посмотреть, смогу ли я вызвать его из сгенерированного LLVM IR.

1

Решение

Можно, но это не очень хорошая идея. Видите ли, функции 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-код.

Перефразируя доктора Яна Малкома: Вы были так озабочены тем, могли ли вы, или нет, вы не переставали думать, стоит ли вам

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]