Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C调用PHP运行时函数作为链接库_Php_C_Shared Libraries - Fatal编程技术网

从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源代码,可以从C调用PHP函数。但是,是否可以从C程序调用PHP运行时,而不使用它作为库


编辑:我下载了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引擎(或它剩下的部分),那么你当然可以。