如何调整 PHP-FPM 的 request_slowlog_timeout 阈值?

文章导读
调整 PHP-FPM 的 request_slowlog_timeout 阈值需要编辑 PHP-FPM 的 pool 配置文件,并确保已设置 slowlog 日志路径。该配置仅用于记录慢请求的堆栈信息,不会强制终止请求,适合在生产环境中定位代码性能瓶颈。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

调整 PHP-FPM 的 request_slowlog_timeout 阈值需要编辑 PHP-FPM 的 pool 配置文件,并确保已设置 slowlog 日志路径。该配置仅用于记录慢请求的堆栈信息,不会强制终止请求,适合在生产环境中定位代码性能瓶颈。

先说结论:修改 pool 配置文件中的参数并重载服务即可生效。

  • 适合:生产环境排查接口响应慢、脚本执行耗时高的问题。
  • 先准备:确认 slowlog 文件路径存在且 PHP-FPM 进程有写入权限。
  • 验收:触发慢请求后,检查慢日志文件是否写入了堆栈跟踪信息。

命令速用版

找到配置文件(通常在 /etc/php-fpm.d/www.conf 或 /etc/php/版本/fpm/pool.d/www.conf),修改以下配置并重载服务。

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

为什么会这样

request_slowlog_timeout 的作用是触发慢日志记录,而不是杀死进程。

当脚本执行时间超过设定阈值,PHP-FPM 会将当前调用堆栈写入 slowlog 指定的文件。这与 request_terminate_timeout 不同,后者会直接终止脚本执行。设置该阈值可以帮助开发者定位具体哪行代码导致了延迟,而不影响用户请求的最终完成。

分步处理

1. 定位配置文件:使用 find 命令查找 www.conf 文件,确认 PHP-FPM 实际加载的配置路径。

2. 编辑参数:在配置文件中取消 slowlog 和 request_slowlog_timeout 的注释,设置合理的秒数。

如何调整 PHP-FPM 的 request_slowlog_timeout 阈值?

3. 检查权限:确保配置文件中指定的 slowlog 路径所属目录允许 PHP-FPM 运行用户(通常为 www-data 或 php-fpm)写入。

4. 重载服务:执行重载命令使配置生效,避免直接 restart 导致现有请求中断。

怎么验证是否生效

使用 sleep 函数构造慢请求,观察日志文件是否有新内容写入。

执行命令 tail -f /var/log/php-fpm.slow.log 实时监控日志,在 PHP 脚本中添加 sleep(6) 模拟超时,刷新页面后检查日志是否出现堆栈信息。

常见坑

1. 混淆 terminate 和 slowlog:request_terminate_timeout 会杀进程,request_slowlog_timeout 仅记录日志,两者用途不同。

如何调整 PHP-FPM 的 request_slowlog_timeout 阈值?

2. 日志权限不足:如果 PHP-FPM 进程无权写入 slowlog 路径,配置生效后不会产生任何日志且通常不报错。

3. 阈值设置过小:阈值设置过低会导致大量正常请求被记录,增加磁盘 I/O 压力并干扰排查。

常见问题

request_slowlog_timeout 和 request_terminate_timeout 有什么区别?

前者仅记录堆栈日志不终止请求,后者会强制杀死超时的脚本进程。

该配置的默认值是多少?

官方文档显示默认值为 none,即默认不开启慢日志记录。

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

仅在脚本超过阈值时产生写入操作,正常请求无影响,但阈值过低会增加 I/O 开销。

参考来源

PHP.net Manual, Install FPM Configuration, https://www.php.net/manual/en/install.fpm.configuration.php