PHP-FPM 的 request_terminate_timeout 默认值为 120 秒,若未正确配置,长任务脚本会被强制终止。
原因分析
PHP 脚本超时并非单点问题,而是 Web 服务器、PHP SAPI 层、应用层阻塞操作三层叠加控制。Nginx 的 fastcgi_read_timeout 默认常为 60 秒,若 PHP 设置了 300 秒但 Nginx 在 60 秒后断连,用户会收到 504 错误。PHP 的 max_execution_time 默认值为 30 秒,只在 Web SAPI 下生效,且会被更短的上层超时截断。PHP-FPM 的 request_terminate_timeout 优先级高于 PHP 内部设置,一旦启用会强制 kill 进程。
解决方案
1. 修改 PHP-FPM 核心配置
路径在/www/server/php/80/etc/php-fpm.conf(版本号按实际替换),找到 request_terminate_timeout = 300 这一行。若需脚本永不过期,将该参数值修改为 0;若需限制具体时间,建议设置为 600 秒以上以匹配业务需求。修改后必须重启 PHP 服务,否则只是改了个寂寞。
2. 同步 Nginx 超时参数
在 Nginx 配置文件 location ~ \.php(.*)$ 段中,必须同步调整三个超时值:fastcgi_read_timeout 600; fastcgi_send_timeout 600; fastcgi_connect_timeout 600;。三个值建议设成一样,且≥max_execution_time,漏掉另外两个照样失败。
3. 验证配置生效
不要只看 phpinfo() 页面,需实测脚本运行时间。若 PHP 日志显示只跑了 40 秒但 access log 显示 62 秒,大概率是 Web 服务器先掐断了。若错误日志里出现 WARNING: [pool www] child 12345 exited on signal 15 (SIGTERM),说明被 FPM 强制终止。
注意事项
request_terminate_timeout 优先级高于 max_execution_time,如果已经调高了 max_execution_time 却还是被杀,八成是它在背后动手。memory_limit 如果太小(比如仍为 128M),脚本可能在超时前先因内存耗尽崩溃。在 PHP-FPM 环境下,set_time_limit(60) 函数可能被禁用,仅对 CLI 模式下的 Apache 模块有效。若遇到 502 Bad Gateway,检查 php-fpm.conf 中 max_children 设置,1G 内存建议设置 64,2G 设置 128。
参考来源
来源:技术搜索结果 - 宝塔面板如何设置 PHP 超时限制_调整 max_execution_time
来源:技术搜索结果 - 设置 php 脚本永不过期
来源:技术搜索结果 - Apache 怎么设置 PHP 脚本超时时间_调整最大执行时间的配置【方法】
来源:技术搜索结果 - php 无限执行时间,php 无限超时