PHP cron任务触发mysqli扩展加载失败:同版本差异问题排查修复
解决Cron运行PHP脚本时mysqli扩展加载失败的问题
这问题我之前处理过好几次,核心原因其实是CLI模式下的PHP配置和Web服务器用的不是同一个php.ini文件——哪怕你确认了PHP版本一致,两者的扩展启用状态、配置参数可能完全不同。下面是一步步的排查和解决方法:
1. 确认CLI和Web端的php.ini路径差异
首先,搞清楚CLI模式下PHP用的是哪个配置文件:
php -i | grep "Loaded Configuration File"
然后在Web端新建一个phpinfo.php文件,内容是<?php phpinfo(); ?>,访问它找到Loaded Configuration File的路径。对比这两个路径,大概率是不一样的(比如Web用的是/etc/php/7.3/fpm/php.ini,CLI用的是/etc/php/7.3/cli/php.ini)。
2. 检查CLI的php.ini中是否启用了mysqli和mysqlnd扩展
打开CLI对应的php.ini文件,做以下检查:
- 找到
extension=mysqli或者extension=mysqli.so这行,确保前面没有被注释掉(即行首没有;)。如果没有这行,手动加上。 - 还要确保
mysqlnd扩展已经启用——因为错误里的undefined symbol: mysqlnd_global_stats说明mysqli依赖的mysqlnd没有加载。找extension=mysqlnd这行,同样确保没有被注释,并且这行要放在mysqli的前面(因为mysqli依赖mysqlnd,加载顺序很重要)。
3. 验证扩展是否成功加载
修改完配置后,运行以下命令查看已加载的扩展:
php -m
在输出列表里找mysqli和mysqlnd,如果都存在,说明配置生效了。此时可以手动运行你的cron脚本,测试是否还会报错:
/usr/bin/php /path/to/your/cron/script.php
(这里建议用PHP的绝对路径,避免cron环境的PATH问题导致调用了其他版本的PHP)
4. 额外注意:cron的环境变量问题
有时候cron的环境变量和你登录shell后的不一样,比如PATH不包含PHP的路径,或者某些系统变量缺失。如果上面的步骤还没解决,可以在cron任务里明确指定PHP的绝对路径,比如把cron任务从:
* * * * * php /path/to/script.php
改成:
* * * * * /usr/bin/php /path/to/script.php
(/usr/bin/php可以通过which php命令获取)
一般来说,做完这几步就能解决CLI模式下mysqli加载失败的问题了。
内容的提问来源于stack exchange,提问作者Boriss
相关产品推荐
相关产品推荐

