request_terminate_timeout是php-fpm主进程强制截断请求的硬性超时机制,全程计时含i/o等待,超时直接kill -9进程导致502;与仅统计cpu执行时间的max_execution_time(触发500)机制不同,需按业务分层设置并协同nginx等参数校准。

request_terminate_timeout 不是“脚本执行时间上限”,而是“请求生命周期硬性截断开关”——它由 PHP-FPM 主进程强制触发,不依赖 PHP 解析器是否响应、GC 是否运行、或 max_execution_time 是否生效。调对了,能防住死循环、卡住的 cURL、挂起的数据库连接;调错了,反而把正常长任务误杀,引发 502 错误。
它和 max_execution_time 的关系必须理清
两者并存,但作用机制完全不同:
-
max_execution_time(php.ini):PHP 解析器内部计时器,只统计 PHP 代码实际 CPU 执行时间;
sleep()、fread()等 I/O 等待、cURL 等待响应、MySQL 网络往返都不计入。一旦超时,抛出Fatal error: Maximum execution time exceeded,返回 HTTP 500。 -
request_terminate_timeout(php-fpm.conf):FPM 主进程从 FastCGI 请求抵达开始计时,全程真实耗时(含所有等待),到点直接
kill -9当前 worker 进程。无 PHP 层错误日志,FPM 日志中出现WARNING: [pool www] child 12345 exited on signal 9 (SIGKILL),Nginx 返回 502。
实验验证:当 max_execution_time = 30、request_terminate_timeout = 0,一个 while(true) { usleep(100000); } 脚本仍会因 30 秒后被 PHP 内部中断而报 500;若设为 request_terminate_timeout = 15s,则 15 秒一到进程被强杀,无 Fatal error,仅 502。
生产环境推荐设置策略
不能统一填 0 或 30s,需按业务分层设定:
-
热接口池(如 /api/v1/*、/health):建议
request_terminate_timeout = 10s。高频短请求,超过 10 秒基本说明下游异常或逻辑缺陷,应快速失败释放 worker。 -
冷接口池(如 /export/order、/report/generate):可设为
300s(5 分钟),配合 Nginx 的fastcgi_read_timeout 300,避免中途切断。注意:该值仍需小于业务 SLA 要求(例如导出必须在 8 分钟内完成,则此处最多设 480s)。 -
绝对禁止设为 0:除非你完全信任所有代码、所有扩展、所有外部服务永不卡死——现实中,一个未设 timeout 的 Redis
GET、一个阻塞的stream_socket_client、一段没加pcntl_signal_dispatch()的信号处理,都可能让 worker 永久僵死,拖垮整个池。
与 Nginx 和其他参数协同校准
单独调这个参数无效,必须联动:
-
必须小于 Nginx 的 fastcgi_read_timeout:否则 FPM 已杀进程,Nginx 还在等响应,最终报 504。例如 FPM 设 30s,Nginx 至少设
fastcgi_read_timeout 35s。 -
要大于 slowlog 阈值:若
request_slowlog_timeout = 5s,则request_terminate_timeout至少设 6s,否则慢日志还没来得及写,进程就被干掉了。 -
配合 pm.max_requests 使用:长周期任务易内存泄漏,建议冷池设
pm.max_requests = 200,热池设500,让进程定期重启,避免 request_terminate_timeout 成为唯一防线。
如何验证是否生效
别只看日志,用三步实测:
- 写一个测试脚本:
<?php sleep(45); echo 'done'; ?> - 用
curl -v http://your-site/test.php观察返回状态码和耗时 - 同时查两处日志:
–/var/log/php-fpm/www-error.log:有无 SIGKILL 记录
–/var/log/nginx/error.log:是否出现upstream timed out或Connection refused
状态码为 502 + FPM 日志有 kill 记录 → 参数生效;500 → 是 max_execution_time 在起作用;504 → Nginx timeout 设置过短。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











