这个问题几乎可以解答我想知道的事情:Is it possible to call PHP's C functions in a C program?
当然,如果用程序编译PHP源代码,可以从C调用PHP函数。但是,如果没有这个,可以从C程序调用PHP运行库作为库吗?
编辑:我下载了PHP源代码并进行了编译。将尝试将目标文件与我自己的代码链接,看看我是否可以从LLVM生成的IR中调用它。
答案 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博士:你是否全神贯注于是否可以,你没有停下来思考是否应该