问题出现得很突然,日志倒是留得挺全。CentOS 7.9 上有个 php 命令行脚本处理队列,卡在一条 SQL 上跑了两个小时,php.ini 里 max_execution_time 明明是 30,脚本完全没有退出。

刚开始盯着「阻塞发生在 mysqli 的连接等待上,CPU 时间统计不到」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。CLI 模式下 max_execution_time 默认按 0 处理,配置文件里的值不参与计时。还有一种是脚本里调用了 set_time_limit(0),显式取消了限制。

还有一种情况,systemd 启动的进程没有加载同一份 php.ini。

第一件事是看 CLI 实际读到的配置值

php -i | grep -E 'max_execution_time|Loaded Configuration'

然后在脚本入口显式设置上限

php -r 'var_dump(ini_get("max_execution_time"));'

随后用包装脚本加超时兜底

timeout -s TERM 1800 php /www/app/queue.php

数据库侧补上连接和查询超时

php -i | grep -E 'mysqli.default_socket|default_socket_timeout'

怎么算真的好了,看的是同一批现象。队列脚本超过设定时间会被 timeout 终止,日志里能看到 TERM 信号,业务不再被单条 SQL 无限期挂住。

补一句。CLI 的超时靠 set_time_limit 和外部 timeout 两道保险,php.ini 那个值只对 FPM 和 Apache 有效;数据库连接超时要单独在 DSN 或 ini 里配。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189