php-fpm slowlog 能抓到 php 脚本执行阶段的慢请求,但不包括 nginx 耗时、网络延迟或数据库连接建立时间;需同时配置 slowlog、request_slowlog_timeout(建议从2s起调)和 request_terminate_timeout,并确保路径可写、配置在 pool 段且重载生效。

php-fpm slowlog 是什么,它真能抓到慢请求吗
能,但只抓 PHP 脚本执行阶段的慢操作,不包括 Nginx 等前置代理耗时、网络延迟或数据库连接建立时间。它的触发条件是:单个请求在 php-fpm 进程内执行超过 request_slowlog_timeout 设定的秒数(比如 5s),且该进程已启用 slowlog 配置。
常见错误现象:slowlog 文件空、日志里全是重复的同一行、或者根本没生成日志文件——大概率是配置没生效,或超时阈值设得太高(比如 30s),实际卡顿都在 8–12s,完全漏掉。
- 必须确保
php-fpm.conf或 pool 配置中同时设置了slowlog(日志路径)和request_slowlog_timeout - 路径需保证
php-fpmworker 进程有写权限(常被忽略,尤其用非 root 用户跑时) - 超时值建议从
2s开始调,线上可逐步放宽到5s,别一上来就设30s
怎么配 slowlog:关键三行不能少
不是加个 slowlog = /var/log/php-fpm-slow.log 就完事。它依赖两个配套参数才能触发记录,缺一不可。
-
slowlog = /var/log/php-fpm-slow.log—— 日志绝对路径,目录需存在且可写 -
request_slowlog_timeout = 2s—— 触发阈值,单位支持s和ms(如500ms) -
request_terminate_timeout = 0(可选但推荐)—— 防止脚本卡死不退出,干扰 slowlog 判断
注意:request_slowlog_timeout 必须写在 pool 段(如 [www] 下),不能只写在全局 php-fpm.conf;否则不生效。改完记得 php-fpm -t && systemctl reload php-fpm。
日志里看到的“backtrace”到底怎么看
slowlog 每条记录包含时间戳、PID、执行时长、请求 URL,以及最关键的 backtrace —— 它是从当前执行点向上回溯的函数调用链,不是完整堆栈,也不含变量值。
典型内容像这样:
[28-May-2024 14:23:11] [pool www] pid 12345 script_filename = /var/www/api/user.php [0x00007f8b1c0a9e80] file_get_contents() /var/www/lib/http.php:42 [0x00007f8b1c0aa120] fetch_remote_data() /var/www/api/user.php:18
重点看最后一行(最深调用)和倒数第二行:这里暴露了 file_get_contents() 在 http.php 第 42 行阻塞了 2.3 秒,而它被 fetch_remote_data() 调用 —— 说明问题不在业务逻辑主干,而在外部 HTTP 请求未设超时。
- 如果 backtrace 里反复出现
mysqli_query或PDOStatement::execute,优先查 SQL 是否缺索引或锁表 - 如果全是
include/require,可能是自动加载器循环或路径解析开销大 - 注意时间戳和 PID,可结合
strace -p PID实时观察该进程系统调用(慎用于生产)
为什么日志写了但分析不动:grep 和 awk 的最小够用组合
slowlog 不是结构化日志,直接打开看效率极低。用命令快速定位瓶颈更实际。
- 查最近 10 条最慢请求:
tail -n 200 /var/log/php-fpm-slow.log | grep -A 2 "script_filename" | head -n 30 - 统计各文件慢请求次数:
awk '/script_filename/ {gsub(/.*\//,"",$3); print $3}' /var/log/php-fpm-slow.log | sort | uniq -c | sort -nr | head -10 - 提取所有耗时 >1s 的调用行:
grep -E "\[0x[0-9a-f]+\].*\(.*\)" /var/log/php-fpm-slow.log | awk '{if($4>1) print $0}'(需日志中第 4 字段为秒数)
别指望靠日志字段对齐做复杂解析 —— slowlog 格式松散,不同 PHP 版本略有差异,简单模式匹配 + 人工核验才是稳定做法。真正要深度分析,得上 xhprof 或 blackfire,slowlog 只负责“先喊一声:这儿可能有问题”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











