将PHP运行时函数作为C的链接库调用

时间:2015-08-08 13:37:47

标签: php c shared-libraries

这个问题几乎可以解答我想知道的事情:Is it possible to call PHP's C functions in a C program?

当然,如果用程序编译PHP源代码,可以从C调用PHP函数。但是,如果没有这个,可以从C程序调用PHP运行库作为库吗?

编辑:我下载了PHP源代码并进行了编译。将尝试将目标文件与我自己的代码链接,看看我是否可以从LLVM生成的IR中调用它。

1 个答案:

答案 0 :(得分:0)

你可以,但不是个好主意。你看,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功能,一个明智的选择就是使用像https://github.com/symisc/PH7这样的嵌入式php解释器(有点遗弃但仍然是PHP 5.3),当然还有运行php代码。

解释Ian Malcom博士:你是否全神贯注于是否可以,你没有停下来思考是否应该