gpt4 book ai didi

php - 从 C 调用 PHP 运行时函数作为链接库

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:53 26 4
gpt4 key购买 nike

这个问题几乎回答了我想知道的:Is it possible to call PHP's C functions in a C program?

当然,如果您使用程序编译 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_string 而不是 c string。你可以在 C 中使用

size_t strlen(const char *str);

如果您想在您的应用程序中使用 php 功能,一个明智的选择就是使用像这样的嵌入式 php 解释器 https://github.com/symisc/PH7 (有点被遗弃,但仍然是 PHP 5.3),当然,运行 php 代码。

套用 Ian Malcom 博士的话:你太专注于你是否可以,你没有停下来思考你是否应该

关于php - 从 C 调用 PHP 运行时函数作为链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31893686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com