如何创建一个包含php文件的php扩展

时间:2015-11-26 10:35:07

标签: php php-extension

我需要构建一个包含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] = &param_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);

}

0 个答案:

没有答案