PHP-FPM 慢日志 slow log 如何配置才能捕获具体脚本?

文章导读
在 PHP-FPM 的进程池配置文件中设置 request_slowlog_timeout 和 slowlog 参数,即可记录执行超过指定时间的脚本路径及调用栈。该配置适用于生产环境性能排查,风险在于阈值过低可能导致日志文件快速增长。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 PHP-FPM 的进程池配置文件中设置 request_slowlog_timeout 和 slowlog 参数,即可记录执行超过指定时间的脚本路径及调用栈。该配置适用于生产环境性能排查,风险在于阈值过低可能导致日志文件快速增长。

先说结论:修改 PHP-FPM 进程池配置文件启用慢日志功能,设定超时阈值即可捕获具体脚本。

  • 适合:生产环境脚本执行超时排查、性能瓶颈定位
  • 先准备:确认 php-fpm.conf 或 pool 配置文件路径,备份原配置
  • 验收:重启 PHP-FPM 服务后,触发慢请求并检查日志文件内容

命令速用版

在 PHP-FPM 的 pool 配置文件(通常为 www.conf)中添加或修改以下配置项:

request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log

修改完成后需要重载 PHP-FPM 配置:

systemctl reload php-fpm

为什么会这样

PHP-FPM 内置了请求执行时间监控机制,当单个请求处理时间超过设定阈值时,会自动生成堆栈跟踪信息。

慢日志不仅记录脚本文件名,还会记录函数调用栈,帮助定位具体卡死的代码行。该机制由 PHP-FPM 进程管理器直接控制,不依赖 PHP 代码内部逻辑。

PHP-FPM 慢日志 slow log 如何配置才能捕获具体脚本?

分步处理

步骤 1:定位配置文件

查找 PHP-FPM 主配置或进程池配置,常见路径为 /etc/php-fpm.d/www.conf 或 /etc/php/版本/fpm/pool.d/www.conf。

步骤 2:编辑配置

取消注释或添加 slowlog 和 request_slowlog_timeout 配置。确保日志目录存在且 PHP-FPM 用户有写入权限。

步骤 3:重启服务

执行 systemctl reload php-fpm 使配置生效。不要使用 restart 以免中断正在处理的请求,除非 reload 无效。

PHP-FPM 慢日志 slow log 如何配置才能捕获具体脚本?

怎么验证是否生效

使用 tail -f 命令监控慢日志文件,同时在浏览器或命令行触发一个已知耗时的请求。

如果配置生效,日志文件中会出现包含脚本绝对路径、行号和调用栈的详细信息。若日志无新增内容,检查文件权限或阈值是否设置过高。

常见坑

1. 日志目录权限不足:PHP-FPM 运行用户(如 www-data)必须对 slowlog 指定路径有写入权限。

2. 相对路径问题:slowlog 路径建议使用绝对路径,避免因工作目录不同导致写入失败。

3. 阈值设置过低:将 request_slowlog_timeout 设置得过小(如 0.1s)会导致正常请求也被记录,迅速占满磁盘空间。

PHP-FPM 慢日志 slow log 如何配置才能捕获具体脚本?

常见问题

慢日志会影响服务器性能吗?

开启慢日志本身开销极小,仅在请求超时时触发写盘操作。但阈值设置过低会导致频繁写日志,增加 I/O 负担。

慢日志能记录 SQL 查询语句吗?

默认情况下只记录 PHP 函数调用栈。若需记录 SQL,需配合 PHP 代码层面的日志或数据库慢查询日志共同分析。

配置后没有生成日志文件怎么办?

检查日志目录是否存在、权限是否正确,以及是否真的有请求超过了设定的超时时间。

参考来源

PHP Official Documentation - FPM Configuration

URL: https://www.php.net/manual/en/fpm.configuration.php#ini.request-slowlog-timeout