它编译成 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)
最佳答案
查看扩展加载错误的最佳方法是从命令行运行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
所以我在config.w32.h中找到了#define PHP_COMPILER_ID
并将其从“VC10”更改为“VC9”。
此后它加载了模块。我能够调用我的函数,但它返回了传统的 500 错误。我怀疑这与VC9/VC10不兼容有关。
这个故事的寓意是,当我使用的 PHP 是用 VC9 编译时,我尝试使用用 VC10 编译的扩展。这会导致各种错误。正确的做法是使用 VC10 编译 PHP src。
关于php - 无法加载自定义 PHP 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17579340/