我需要构建一个包含PHP文件的PHP扩展。我已阅读Extension Writing Part I: Introduction to PHP and Zend并了解如何使用C创建PHP扩展。
但我无法包含PHP文件。
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_hello.h"
static zend_function_entry hello_functions[] = {
PHP_FE(hello_world, NULL)
{NULL, NULL, NULL}
};
zend_module_entry hello_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
PHP_HELLO_WORLD_EXTNAME,
hello_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
#if ZEND_MODULE_API_NO >= 20010901
PHP_HELLO_WORLD_VERSION,
#endif
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_HELLO
ZEND_GET_MODULE(hello)
#endif
PHP_FUNCTION(hello_world)
{
char *name;
int name_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
RETURN_NULL();
}
php_require_once(name); // <-- is this possible?
//RETURN_STRING("Hello World", 1);
}
我也尝试过PHP-CPP,但这需要一些依赖安装,这在我使用的共享主机上是不可能的。
正如@Karoly Horvath所说,我使用了“call_user_function_ex”,但它显示了致命错误:函数调用失败这是我的完整代码
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_hello.h"
#define functionNameStr "require_once"
static zend_function_entry hello_functions[] = {
PHP_FE(hello_world, NULL)
{NULL, NULL, NULL}
};
zend_module_entry hello_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
PHP_HELLO_WORLD_EXTNAME,
hello_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
#if ZEND_MODULE_API_NO >= 20010901
PHP_HELLO_WORLD_VERSION,
#endif
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_HELLO
ZEND_GET_MODULE(hello)
#endif
PHP_FUNCTION(hello_world)
{
char *name;
int name_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
RETURN_NULL();
}
zval *function_name, *retval_ptr, *param_val, **params[1];
TSRMLS_FETCH();
MAKE_STD_ZVAL(function_name);
ZVAL_STRINGL(function_name, functionNameStr,
strlen(functionNameStr), 0);
MAKE_STD_ZVAL(param_val);
ZVAL_STRINGL(param_val, name,
strlen(name), 0);
params[0] = ¶m_val;
if (call_user_function_ex(CG(function_table), NULL, function_name,
&retval_ptr, 1, params, 0, NULL TSRMLS_CC) != SUCCESS) {
php_printf("%s",name);
zend_error(E_ERROR, "Function call failed");
RETURN_NULL();
}else{
php_printf("%s","SUCCESS");
}
FREE_ZVAL(function_name);
FREE_ZVAL(param_val);
}