request_slowlog_timeout 是 PHP-FPM 的慢请求日志触发阈值,单位为秒(支持小数),仅当单次请求执行时间超过该值时,才将调用栈写入 slowlog 文件;它不记录 SQL 慢查询,也不终止请求,需配合 slowlog 路径配置且置于 pool 段内生效。
request_slowlog_timeout 是什么,它不记录 SQL 慢查询
是 PHP-FPM 进程级别的超时控制参数,不是 MySQL 或 PDO 的慢查询日志开关。它只在 PHP 脚本**单次请求执行时间超过设定阈值**时,把当前请求的完整调用栈(包括函数调用、文件路径、行号)写入
文件——和数据库无关,也和
完全无关。
常见误解是把它当成“PHP 版 slow_query_log”,结果配了却看不到 SQL 相关内容,因为压根不采集 SQL 执行信息。
它触发的是
主进程对 worker 子进程的采样,依赖
配置项指向有效路径
必须配合
才能落地日志,否则超时也不写
单位是秒,支持小数,比如
设为
表示禁用,设为
无效(会解析失败)
如何正确启用并验证 slowlog 生效
修改 PHP-FPM Pool 配置(如
),不是主配置
:
注意:
路径需确保 PHP-FPM worker 进程用户(通常是
或
)有写权限;目录得提前创建,否则日志静默丢弃。
立即学习
“
PHP免费学习笔记(深入)
”;
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
改完必须
(版本号按实际调整),
也可但会中断连接
用
可校验语法,但不会检查
路径是否可写
验证方式:写个死循环脚本(
),访问后等超时,再查
日志里会出现类似
的头,接着是完整 backtrace
request_slowlog_timeout 和 pm.process_idle_timeout、request_terminate_timeout 的区别
这三个 timeout 完全不同作用,混用会导致预期外行为:
:仅触发 slowlog 记录,不杀进程,不影响请求继续执行
:硬性终止超时请求(类似 Apache 的
),会返回 502/504,且不保证写完 slowlog 就被 kill
:只对 static 模式无效;在 ondemand/dynamic 下控制空闲 worker 存活时间,和单次请求耗时无关
典型误配:把
和
同时设,结果永远触发不了 slowlog——因为请求在 5 秒就被杀了,根本撑不到 10 秒。
线上环境慎用低阈值,尤其不要设成 100ms 级别
低于 500ms 的
在高并发下会产生海量日志,迅速占满磁盘,还可能因频繁写磁盘拖慢整个 FPM 进程组。
建议初始值设为
,观察一周后再按业务 P95 响应时间下调(比如 P95 是 1.2s,可试
)
避免在所有 pool 全局启用,优先在问题接口对应的 pool 单独开(如
段)
日志轮转要配好:
对
单独处理,加
防止 FPM 写错位
注意:
不支持
动态路径,不能像 access.log 那样自动分日期
真正卡住的请求,往往不是某一行代码慢,而是外部依赖(Redis 超时、cURL hang、锁竞争)导致的阻塞,slowlog 的 backtrace 能帮你定位到那一行「发起阻塞调用」的代码,而不是阻塞本身——这点容易忽略。
request_slowlog_timeoutslowlogslow_query_logphp-fpmslowlogslowlog = /var/log/php-fpm-slow.logrequest_slowlog_timeout = 2.500s/etc/php/8.2/fpm/pool.d/www.confphp-fpm.conf
slowlog = /var/log/php-fpm-slow.log
request_slowlog_timeout = 5s
slowlogwww-datanginxsudo systemctl reload php8.2-fpmrestartphp-fpm -tslowlogwhile(true){usleep(100000);}tail -f /var/log/php-fpm-slow.log[pool www] pid 12345 script '/var/www/test.php' (listening on 127.0.0.1:9000, request: 'GET /test.php')request_slowlog_timeoutrequest_terminate_timeoutTimeoutpm.process_idle_timeoutrequest_slowlog_timeout = 10srequest_terminate_timeout = 5srequest_slowlog_timeout5s2s[api]logrotateslowlogcopytruncateslowlog%y/%m/%d