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

1

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

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

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

Теги:
shared-libraries

1 ответ

0

Вы можете, но это не очень хорошая идея. Вы видите, что 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-код,

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

  • 0
    В моем случае я действительно должен: я делаю бэкэнд PHP LLVM и мне нужна среда выполнения в виде библиотеки, чтобы мне не приходилось писать свою собственную или компилировать ее каким-то конкретным способом.
  • 0
    Но, может быть, от написания моей собственной системы сборки исходного кода PHP не уйдет?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню