php扩展相关问题

这里把平时遇到的扩展相关问题做一个汇总,方便回顾

一、 “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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值