0

它编译成一个没有问题的DLL。但是,当我在 PHP 中使用该函数或在列表extension_loaded中查找它时,它不会被识别为已加载。phpinfo我将 DLL 放入扩展文件夹,然后将其添加到 php.ini 中。我认为问题可能出在代码中。

我错过了什么或做错了什么?

ZEND_FUNCTION(MyFunction) 
{

    char var1 = NULL;
    char var2 = NULL;
    char var3 = NULL;
    char var4 = NULL;
    char var5 = NULL;
    char var6 = NULL;
    int var7;
    double *var8;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ssssssla", &var1, &var2,
                                &var3, &var4, &var5, &var6, &var7, &var8) == FAILURE) {
        RETURN_NULL();
    }

    Cfunction(&var1,&var2,&var3,&var4,&var5, &var6, var7, var8);

    RETURN_TRUE;
}

zend_function_entry MyExtension_functions[] = {
    ZEND_FE(MyFunction, NULL)
    {NULL,NULL,NULL}
};


PHP_MINIT_FUNCTION(MyExtension) {
    return SUCCESS;
}

PHP_MSHUTDOWN_FUNCTION(MyExtension) {
    return SUCCESS;
}

PHP_MINFO_FUNCTION(MyExtension) {
    php_info_print_table_start();
    php_info_print_table_header(2, "MyExtension v1.0", "");
    php_info_print_table_row(2, "PHP Extension", "enabled");
    php_info_print_table_end();
} 




zend_module_entry MyExtension_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
#endif
    "MyExtension",
     MyExtension_functions,
    NULL,
    NULL,
    NULL,
    NULL,
    PHP_MINFO(MyExtension),
    "1.0",
    STANDARD_MODULE_PROPERTIES
};

    ZEND_GET_MODULE(MyExtension)
4

1 回答 1

1

查看扩展加载错误的最佳方法是从命令行运行php.exe。这向我显示了错误消息

Warning: PHP Startup: MyExtension: Unable to initialize module
Module compiled with module API=20121212
PHP    compiled with module API=20090626
These options need to match
 in Unknown on line 0

所以我在zend_modules.h中找到了#define ZEND_MODULE_API_NO,把它从20121212改成了20090626。

然后它抱怨:

Warning: PHP Startup: MyExtension: Unable to initialize module
Module compiled with build ID=API20090626,NTS,VC10
PHP    compiled with build ID=API20090626,NTS,VC9
These options need to match
 in Unknown on line 0

所以我#define PHP_COMPILER_ID在 config.w32.h 中找到并将其从“VC10”更改为“VC9”。

在此之后它加载了模块。我能够调用我的函数,但它返回了一个传统的 500 错误。我怀疑这与 VC9/VC10 不兼容有关。

这个故事的寓意是,当我使用的 PHP 是用 VC9 编译时,我尝试使用用 VC10 编译的扩展。这会导致各种错误。合适的做法是使用 VC10 编译 PHP src。

于 2013-07-11T16:28:59.093 回答