PHP 8.5.5 不产生 SQL 慢查询日志,仅通过 PHP-FPM 的 slowlog 记录超时 PHP 脚本调用栈;配置必须写在 Pool 文件(如 /etc/php/8.5/fpm/pool.d/www.conf)的 [www] 段内,启用 slowlog = /var/log/php-fpm/www-slow.log 和 request_slowlog_timeout = 2s(分号须删除),路径需存在且属主为 www-data,修改后需 systemctl reload php8.5-fpm 并用 sleep 脚本验证日志输出。

PHP 8.5.5 本身不产生“慢查询日志”——它不记录 SQL,只记录 PHP 脚本执行超时的调用栈。你要监控的是 PHP-FPM 的 slowlog,不是 MySQL 的慢查询日志。
PHP-FPM slowlog 配置在哪改?不是 php.ini
配置必须写在 PHP-FPM 的 Pool 文件里(如 /etc/php/8.5/fpm/pool.d/www.conf),不是 php.ini,也不是全局 php-fpm.conf。常见错误是改错文件,导致日志完全不生成。
-
slowlog = /var/log/php-fpm/www-slow.log:路径父目录(如/var/log/php-fpm/)必须存在,且属主为 PHP-FPM 运行用户(通常是www-data或nginx) -
request_slowlog_timeout = 2s:必须大于 0,单位支持s、m,但不支持ms(500ms是非法写法) - 这两行前面的分号
;必须删掉——90% 的“配置无效”问题出在这里
怎么验证 slowlog 真的在工作?别等线上卡顿
改完配置后立刻验证,避免上线后才发现没生效。用一个可控脚本触发超时:
- 新建
/var/www/html/slow-test.php,内容:<?php sleep(3); ?> - 确保
request_slowlog_timeout设为2s(比sleep(3)小) - 重载服务:
sudo systemctl reload php8.5-fpm(Ubuntu/Debian)或sudo systemctl reload php-fpm(CentOS/RHEL) - 访问该脚本一次,然后立刻执行:
tail -n 10 /var/log/php-fpm/www-slow.log - 看到类似
[pool www] pid 12345 script_filename = /var/www/html/slow-test.php和多行[0x...]调用栈,说明已生效
slowlog 里看到 curl_exec 或 PDO::query 卡住,下一步怎么做?
日志只告诉你“卡在这行”,不告诉你为什么卡。关键要结合上下文排查:
立即学习“PHP免费学习笔记(深入)”;
-
curl_exec()卡住:检查是否漏设CURLOPT_TIMEOUT、CURLOPT_CONNECTTIMEOUT;DNS 解析慢可加CURLOPT_DNS_CACHE_TIMEOUT -
PDO::query()或mysqli_query()卡住:不是 SQL 慢,而是连接建立失败、锁等待、或未响应的远程数据库;先用mysqladmin ping或telnet db-host 3306测试连通性 - backtrace 显示大量重复函数名(如连续 20 行
get_user()):大概率是无限递归或异常未捕获导致重试循环 - 注意:
slowlog不包含变量值、不记录网络延迟、不反映 MySQL 锁等待时间(Lock_time在 MySQL 慢日志里)
最易被忽略的点:slowlog 是 per-pool 的,你改了 [www] 段,但实际请求走的是 [api] 池——得去对应 pool 段配,否则日志永远为空。



















