在 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 代码内部逻辑。
分步处理
步骤 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 无效。
怎么验证是否生效
使用 tail -f 命令监控慢日志文件,同时在浏览器或命令行触发一个已知耗时的请求。
如果配置生效,日志文件中会出现包含脚本绝对路径、行号和调用栈的详细信息。若日志无新增内容,检查文件权限或阈值是否设置过高。
常见坑
1. 日志目录权限不足:PHP-FPM 运行用户(如 www-data)必须对 slowlog 指定路径有写入权限。
2. 相对路径问题:slowlog 路径建议使用绝对路径,避免因工作目录不同导致写入失败。
3. 阈值设置过低:将 request_slowlog_timeout 设置得过小(如 0.1s)会导致正常请求也被记录,迅速占满磁盘空间。
常见问题
慢日志会影响服务器性能吗?
开启慢日志本身开销极小,仅在请求超时时触发写盘操作。但阈值设置过低会导致频繁写日志,增加 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