
通过配置 php-fpm 的慢日志(slowlog),可自动捕获超时执行的 php 请求,并输出完整的调用栈,精准定位 `sleep()`、数据库阻塞、文件锁、远程 api 等隐藏性能瓶颈。
在生产环境中,PHP 脚本偶发性变慢往往难以复现,尤其当问题源于未被注释或误留的 sleep(5)、usleep(),或深层依赖中的同步 I/O 操作时,单纯靠代码搜索(如 grep -r "sleep" .)容易遗漏动态调用或混淆上下文。此时,PHP-FPM 原生支持的慢请求追踪机制是最可靠、侵入性最低的诊断手段。
✅ 启用 PHP-FPM 慢日志(推荐配置)
编辑对应 Pool 的配置文件(如 /etc/php/8.2/fpm/pool.d/www.conf),添加或修改以下两行:
; 启用慢日志,指定日志路径(确保目录可写) slowlog = /var/log/php-fpm/slow.log ; 触发慢日志的阈值:单个请求执行时间 ≥ 3 秒 request_slowlog_timeout = 3s
? 提示:建议从 2s 或 3s 开始,避免日志过载;线上环境可结合 access.log 中的 request_time 字段交叉验证。
? 慢日志输出示例
当某请求因 sleep(4) 卡住时,slow.log 将记录类似内容:
[12-Oct-2024 14:22:36] [pool www] pid 12345 script_filename = /srv/www/example.com/public/index.php [0x00007f8a1b2c3d40] sleep() /srv/www/example.com/app/helpers/DebugHelper.php:42 [0x00007f8a1b2c3e50] processRequest() /srv/www/example.com/public/index.php:18
该堆栈清晰指出:sleep() 调用发生在 DebugHelper.php 第 42 行——无需猜测,直接定位问题根源。
立即学习“PHP免费学习笔记(深入)”;
⚠️ 注意事项与增强实践
- 权限与路径安全:确保 slowlog 文件路径由 www-data(或 PHP-FPM 运行用户)可写,且不暴露于 Web 可访问目录。
- 日志轮转:配合 logrotate 防止日志无限增长,例如按日切割 + 保留 7 天。
-
补充诊断:慢日志仅捕获“耗时长”,不区分 CPU/IO 类型。如需进一步分析,可搭配:
- strace -p
实时跟踪系统调用; - xdebug.profiler_enable_trigger 启用函数级性能分析(仅限开发/预发);
- blackfire.io 或 Tideways 实现可视化性能剖析。
- strace -p
- 避免误报:对已知需长时间运行的脚本(如导出任务),应使用 set_time_limit(0) 并单独排除慢日志监控,或通过 fastcgi_finish_request() 提前返回响应。
启用慢日志后,你不再需要“碰运气”翻代码找 sleep() ——它会主动告诉你:“哪里卡住了,为什么卡,以及怎么卡的”。这是 PHP 运维与性能优化中最值得优先落地的基础能力。









