问题出现得很突然,日志倒是留得挺全。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 里配。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
