这里把平时遇到的扩展相关问题做一个汇总,方便回顾
一、 “Unable to initialize module” 问题分析
公司的php环境目前并没有统一,因此CICD构建机器上部署了多套php环境,每套php都有各自的php.ini 文件,扩展安装目录。有同事反馈在php7.3环境中构建时,遇到了以下问题
PHP Warning: PHP Startup: imagick: Unable to initialize module
Module compiled with module API=20190902
PHP compiled with module API=20180731
These options need to match
网上搜了一些资料,再经过个人查阅源码、实践操作,对这个问题有了更多的认识。
下面是 vim ext/standard/dl.c +206 的报出这一提示的代码位置
module_entry = get_module();
if (module_entry->zend_api != ZEND_MODULE_API_NO) {
php_error_docref(NULL, error_type,
"%s: Unable to initialize module\n"
"Module compiled with module API=%d\n"
"PHP compiled with module API=%d\n"
"These options need to match\n",
module_entry->name, module_entry->zend_api, ZEND_MODULE_API_NO);
DL_UNLOAD(handle);
return FAILURE;
}
if(strcmp(module_entry->build_id, ZEND_MODULE_BUILD_ID)) {
php_error_docref(NULL, error_type,
"%s: Unable to initialize module\n"
"Module compiled with build ID=%s\n"
"PHP compiled with build ID=%s\n"
"These options need to match\n",
module_entry->name, module_entry->build_id, ZEND_MODULE_BUILD_ID);
DL_UNLOAD(handle);
return FAILURE;
}
grep 20190902 -rn *
main/php.h:#define PHP_API_VERSION 20190902
Zend/zend_extensions.h:#define ZEND_EXTENSION_API_NO 320190902
Zend/zend_modules.h:#define ZEND_MODULE_API_NO 20190902
问题分析
每当PHP要开发一个新的大版本或者小版本时,都会修改此常量的值,如果编译模块时php的所用的主版本+次版本号与所要安装到的环境的主版本+次版本号不一致,在模块加载的时候就会报这个错误。
例如,编译模块采用7.1,安装到7.3的环境中,就会出现这个错误。
解决办法也很简单,就是用实际部署模块的php去编译扩展的源码。
二、 Unable to load dynamic library networkbench.so
在灰度机器执行一个脚本时,发现执行php命令后,报下面的warning
PHP Warning: PHP Startup: Unable to load dynamic library '/software/php7/lib/php/extensions/no-debug-non-zts-20160303/networkbench.so' - /software/php7/lib/php/extensions/no-debug-non-zts-20160303/networkbench.so: cannot open shared object file: No such file or directory in Unknown on line 0
网上搜networkbench.so 这个组件,是听云的性能监控agent扩展,怀疑这个扩展被下掉了,但是php.ini中extension引用还保留着,验证后确实是这样,解决办法就是删除 php.ini 对这个扩展的引用
三、 Module ‘mongodb’ already loaded in Unknown on line 0
同样是在灰度执行php脚本遇到的报错
PHP Warning: Module 'mongodb' already loaded in Unknown on line 0
这个是因为mongodb扩展被重复加载导致的,到php.ini中检查,发现下面的扩展声明出现了两次
extension=mongodb.so
删除一条声明即可
四、 mac configure: error: Cannot find OpenSSL’s <evp.h>
参考 https://www.jianshu.com/p/8eaabd900c9d
新版本mac os的 openssl安装路径是下面的路径
/opt/homebrew/Cellar/openssl@3/3.1.0/include/openssl/evp.h
/opt/homebrew/Cellar/openssl@1.1/1.1.1t/include/openssl/evp.h
编译时增加 --with-openssl-dir 参数,示例如下
./configure --with-openssl-dir=/opt/homebrew/Cellar/openssl@3/3.1.0