PHP slowlog 是超时采样机制,非全量日志;可通过设极低超时阈值、启用XHProf/Blackfire等APM工具、应用层埋点或Web服务器日志关联实现近似全量追踪。

PHP 的 slowlog 本质是**超时采样机制**,不是全量请求日志。它只在单个请求执行时间超过 request_slowlog_timeout 时记录,无法直接开启“记录全部请求”。但可以通过组合配置和外部工具实现**近似全量采样或全量追踪**的效果。
方法一:极小化 slowlog 超时阈值(简易采样)
将 request_slowlog_timeout 设为极低值(如 0.01s 或 0.1s),让绝大多数请求都触发 slowlog 记录。这相当于高频采样,适合观察整体请求分布。
- 在
php-fpm.conf或 pool 配置中添加:
request_slowlog_timeout = 0.1s slowlog = /var/log/php-fpm/slow.log
- 注意:该方式会产生大量日志,需配合日志轮转(
logrotate)和磁盘监控 - 不适用于高并发生产环境(I/O 压力大、日志爆炸)
- 仅能获取执行时间、脚本路径、堆栈,无完整请求上下文(如 URL、POST 数据)
方法二:启用 PHP 内置的 trace 日志(需编译支持)
PHP 本身不提供全量请求日志,但可通过 --enable-trace 编译参数启用底层执行跟踪(非标准发行版默认关闭)。更可行的是使用 phptrace(已归档)或现代替代方案:
-
XHProf / XHGui:轻量级性能分析器,可配置为对所有请求采样(如
sampling_rate = 1) - Blackfire 或 Tideways:商业/开源 APM 工具,支持 100% 请求采集(需 agent + dashboard)
- 这些工具记录调用栈、SQL、HTTP 调用等,远超 slowlog 信息量
方法三:在应用层统一埋点(推荐用于关键接口)
在框架入口(如 public/index.php)或中间件中手动记录请求元数据:
立即学习“PHP免费学习笔记(深入)”;
- 记录时间、URI、方法、响应码、耗时、内存使用(
memory_get_peak_usage()) - 异步写入文件/Redis/日志服务,避免阻塞主流程
- 示例代码片段:
$start = microtime(true);
$uri = $_SERVER['REQUEST_URI'] ?? '';
register_shutdown_function(function() use ($start, $uri) {
$duration = round((microtime(true) - $start) * 1000, 2);
error_log("[$uri] {$duration}ms " . date('Y-m-d H:i:s') . "\n", 3, '/var/log/php-access.log');
});方法四:借助 Web 服务器日志 + 关联分析
nginx/Apache 记录完整访问日志(含时间、URL、状态码、耗时),再与 slowlog 时间戳对齐做关联分析:
- 开启 nginx 的
$request_time和自定义日志格式 - 用脚本(Python/awk)匹配 slowlog 中的时间戳与 access.log 中相近时间的请求
- 虽不能还原 PHP 内部堆栈,但可定位慢请求对应的完整 HTTP 上下文



















