PHP CLI 被系统级 timeout 杀掉需同步调整 max_execution_time(-d 参数)、ulimit -t 和 WSL systemd 的 DefaultLimitCPU;数据库中断则需设置 SESSION wait_timeout 或手动重连,flush()/set_time_limit() 在 CLI 下无效。

PHPStorm 运行长脚本时连接中断,不是 PHPStorm 的锅,而是 CLI 环境 + 数据库连接两层被系统或服务主动掐断。必须分清楚:脚本卡住是 PHP 被 kill,还是数据库报 MySQL server has gone away —— 两者原因和解法完全不同。
PHP CLI 被系统级 timeout 杀掉怎么办
PHPStorm 只是调用你配置的 PHP 解释器,它本身不设超时。真正动手的是系统对 CPU 时间的限制(ulimit -t)、WSL systemd 的 DefaultLimitCPU、或者 PHP 自身的 max_execution_time。
- 先在终端直接运行:
php your_script.php,如果也卡住或退出码为 -1,问题不在 PHPStorm - 在 PHPStorm 的 Run Configuration → Interpreter options 里加:
-d max_execution_time=0(注意:CLI 模式下ini_set('max_execution_time', 0)不生效) - WSL2 用户务必检查:
systemctl show --property=DefaultLimitCPU;若返回DefaultLimitCPU=300,说明 5 分钟就被杀,需改/etc/systemd/logind.conf中的UserTasksMax=infinity并重启systemd-logind - 临时绕过:在 PHPStorm Terminal 里先执行
ulimit -t unlimited,再跑脚本(仅对该 Terminal 会话有效)
数据库连接中途断开(MySQL server has gone away)
常发生在脚本执行几十秒后首次查询失败,错误信息明确包含 server has gone away 或 Connection reset by peer。根本原因是 MySQL 的 wait_timeout(默认 8 小时)虽长,但 CLI 脚本往往长时间没发任何 SQL,连接在服务端被回收;而 PHP 的 PDO/MySQLi 实例并不自动重连。
- 启动时显式设置会话级超时:
$pdo->exec("SET SESSION wait_timeout = 28800");(单位秒,建议 ≤ 28800) - 不要依赖
mysql.connect_timeout或default_socket_timeout—— 它们管的是“建连阶段”,不是“空闲保活” - 更稳妥的做法是在每次关键查询前做连接检测:
if (!$pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS)) { $pdo = new PDO($dsn, $user, $pass); },或封装一个reconnectIfClosed()辅助方法 - Laravel 等框架自带重连逻辑,但原生 PDO 不会自动重试,异常捕获后必须手动重建连接
为什么 flush() / echo / set_time_limit(0) 都没用
这些操作只影响 PHP 层或 HTTP 响应流,在 CLI 模式下 flush() 无意义;set_time_limit(0) 在 CLI 下默认就无效(除非 php.ini 显式设了值);而 echo 输出只是写到 stdout 缓冲区,并不会触发系统级保活机制。
立即学习“PHP免费学习笔记(深入)”;
-
set_time_limit()在 CLI 下受 php.ini 的max_execution_time值压制,且不能在register_shutdown_function()里调用 -
ignore_user_abort(true)对 CLI 脚本完全无效——它只在 Web SAPI 下有意义(客户端关浏览器后继续跑) - 别指望输出点文字就能“骗过” systemd 或 MySQL —— 它们看的是进程状态和网络包,不是 stdout 内容
最易被忽略的一点:WSL2 + Ubuntu 22.04+ 默认启用 systemd user session,DefaultLimitCPU 是硬性熔断开关,哪怕你把 PHP 和 MySQL 所有超时都设成 0,它照样在 5 分钟整准时 kill 进程,且不写任何日志。遇到“运行到 300 秒必挂”,第一反应不该是查 PHP 配置,而是 systemctl show --property=DefaultLimitCPU。


















