从C调用PHP运行时函数作为链接库
这个问题几乎回答了我想知道的: 当然,如果用程序编译PHP源代码,可以从C调用PHP函数。但是,是否可以从C程序调用PHP运行时,而不使用它作为库从C调用PHP运行时函数作为链接库,php,c,shared-libraries,Php,C,Shared Libraries,这个问题几乎回答了我想知道的: 当然,如果用程序编译PHP源代码,可以从C调用PHP函数。但是,是否可以从C程序调用PHP运行时,而不使用它作为库 编辑:我下载了PHP源代码并进行了编译。将尝试用我自己的代码链接对象文件,并查看是否可以从LLVM生成的IR调用它。可以,但这不是一个好主意。你看,php函数是由php脚本使用的,它们有自己的数据结构和内存管理,不是由C直接使用的。这里有很多,我指的是很多宏和语法糖,只是为了向解析器公开一个函数。例如: ZEND_FUNCTION(func_num_
编辑:我下载了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_字符串而不是c字符串。在C语言中,只要
size_t strlen(const char *str);
如果您想在应用程序中使用php功能,一个明智的选择就是使用这样的嵌入式php解释器(有点被放弃了,但仍然是PHP5.3),当然,还可以运行php代码
转述伊恩·马尔科姆博士的话:你全神贯注于你是否能做到,你没有停下来思考你是否应该做到,但这不是一个好主意。你看,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_字符串而不是c字符串。在C语言中,只要
size_t strlen(const char *str);
如果您想在应用程序中使用php功能,一个明智的选择就是使用这样的嵌入式php解释器(有点被放弃了,但仍然是PHP5.3),当然,还可以运行php代码
转述Ian Malcom博士的话:你全神贯注于你是否可以,你没有停下来思考你是否应该在我的情况下,我真的应该:我正在制作一个PHP LLVM后端,并且需要将运行时作为一个库,这样我就不必编写自己的或以某种特定的方式编译它。但是,也许为PHP源代码编写自己的构建系统是没有出路的?这就改变了问题。链接的源代码是前端的良好开端。比破解Zend引擎更容易,插入LLVM后端也更容易。好吧,如果你愿意删除不必要的部分插入后端并正确引导Zend引擎(或它的剩余部分),那么你当然可以。在我的情况下,我真的应该:我正在制作一个PHP LLVM后端,并且需要将运行时作为一个库,这样我就不必编写自己的或以某种特定的方式编译它。但是,也许为PHP源代码编写自己的构建系统是没有出路的?这就改变了问题。链接的源代码是前端的良好开端。比破解Zend引擎更容易,插入LLVM后端也更容易。好吧,如果你愿意删除不必要的部分来插入后端,并正确引导Zend引擎(或它剩下的部分),那么你当然可以。