CentOS7下PHP74的die()/exit()失效及动态库加载告警问题
在CentOS 7系统中安装了以下PHP 7.4相关包:
libicu71-71.1-2.el7.remi.x86_64.rpm libsodium-1.0.18-1.el7.x86_64.rpm php-7.4.33-2.el7.remi.x86_64.rpm php-bcmath-7.4.33-2.el7.remi.x86_64.rpm php-cli-7.4.33-2.el7.remi.x86_64.rpm php-common-7.4.33-2.el7.remi.x86_64.rpm php-devel-7.4.33-2.el7.remi.x86_64.rpm php-gd-7.4.33-2.el7.remi.x86_64.rpm php-intl-7.4.33-2.el7.remi.x86_64.rpm php-json-7.4.33-2.el7.remi.x86_64.rpm php-mbstring-7.4.33-2.el7.remi.x86_64.rpm php-mysqlnd-7.4.33-2.el7.remi.x86_64.rpm php-opcache-7.4.33-2.el7.remi.x86_64.rpm php-pdo-7.4.33-2.el7.remi.x86_64.rpm php-pecl-mcrypt-1.0.5-1.el7.remi.7.4.x86_64.rpm php-pecl-solr2-2.6.0-1.el7.remi.7.4.x86_64.rpm php-pecl-zip-1.21.1-1.el7.remi.7.4.x86_64.rpm php-pgsql-7.4.33-2.el7.remi.x86_64.rpm php-process-7.4.33-2.el7.remi.x86_64.rpm php-soap-7.4.33-2.el7.remi.x86_64.rpm php-sodium-7.4.33-2.el7.remi.x86_64.rpm php-tidy-7.4.33-2.el7.remi.x86_64.rpm php-xml-7.4.33-2.el7.remi.x86_64.rpm php-xmlrpc-7.4.33-2.el7.remi.x86_64.rpm postgresql-libs-9.2.24-8.el7_9.x86_64.rpm
安装后出现PHP启动告警:
PHP Startup: Unable to load dynamic library 'oci8' (tried: /opt/remi/php74/root/usr/lib64/php/modules/oci8 (/opt/remi/php74/root/usr/lib64/php/modules/oci8: cannot open shared object file: No such file or directory), /opt/remi/php74/root/usr/lib64/php/modules/oci8.so (libclntsh.so.21.1: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_oci' (tried: /opt/remi/php74/root/usr/lib64/php/modules/pdo_oci (/opt/remi/php74/root/usr/lib64/php/modules/pdo_oci: cannot open shared object file: No such file or directory), /opt/remi/php74/root/usr/lib64/php/modules/pdo_oci.so (libclntsh.so.21.1: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'rdkafka.so' (tried: /opt/remi/php74/root/usr/lib64/php/modules/rdkafka.so (/opt/remi/php74/root/usr/lib64/php/modules/rdkafka.so: cannot open shared object file: No such file or directory), /opt/remi/php74/root/usr/lib64/php/modules/rdkafka.so.so (/opt/remi/php74/root/usr/lib64/php/modules/rdkafka.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'zmq' (tried: /opt/remi/php74/root/usr/lib64/php/modules/zmq (/opt/remi/php74/root/usr/lib64/php/modules/zmq: cannot open shared object file: No such file or directory), /opt/remi/php74/root/usr/lib64/php/modules/zmq.so (libzmq.so.5: cannot open shared object file: No such file or directory)) in Unknown on line 0
同时发现die()和exit()函数完全失效,只有return能正常工作,系统中找不到libclntsh.so文件。
一、解决PHP扩展加载告警
1. oci8 / pdo_oci 扩展告警
这两个扩展依赖Oracle客户端库libclntsh.so.21.1,系统未安装该库导致加载失败:
- 如果不需要这两个扩展:找到PHP配置文件(通常是
/etc/opt/remi/php74/php.ini或/etc/opt/remi/php74/php.d/下的对应配置文件),注释掉以下两行:extension=oci8 extension=pdo_oci - 如果需要使用Oracle数据库连接:安装Oracle Instant Client(推荐适配CentOS7的19c或21c版本),然后安装remi仓库中对应PHP7.4的
php-oci8或php-oci8-21c包:yum install php-oci8-21c -y --enablerepo=remi-php74
2. rdkafka 扩展告警
告警显示找不到rdkafka.so,说明未安装该扩展:
- 不需要则禁用:找到配置中
extension=rdkafka.so的行,注释掉; - 需要则安装:从remi仓库安装对应扩展:
yum install php-pecl-rdkafka -y --enablerepo=remi-php74
3. zmq 扩展告警
同样是未安装对应扩展或依赖库:
- 不需要则禁用:注释配置中的
extension=zmq; - 需要则安装:安装remi仓库的
php-pecl-zmq包:yum install php-pecl-zmq -y --enablerepo=remi-php74
修改配置后,重启PHP-FPM或CLI服务生效:
systemctl restart php74-php-fpm
二、解决die()/exit()失效问题
这种情况大多和输出缓冲或PHP配置有关,按以下步骤排查:
- 检查输出缓冲配置:打开
php.ini,找到output_buffering项,设置为Off:output_buffering = Off - 手动刷新缓冲:如果需要保留输出缓冲,在调用
die()/exit()前强制刷新缓冲:ob_flush(); flush(); die("内容"); - 检查是否有 shutdown 函数劫持:查看代码中是否注册了
register_shutdown_function,这类函数可能会在die()/exit()后继续执行,导致看起来函数失效; - 验证PHP配置:检查
disable_functions项是否包含die或exit(如果被禁用会直接报错,而非失效,这一步可作为排除项)。
修改php.ini后同样需要重启PHP服务生效。
内容的提问来源于stack exchange,提问作者Sergey Khramov

