跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何配置PHP-FPM的慢查询日志_设置request_slowlog_timeout参数

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

相关文章