frankenphp 1.5 不支持原生慢请求日志,需通过 caddy 变量透传耗时并结合 json 日志筛选,或在 php 应用层用 hrtime 主动埋点写入独立 slow.log 文件。

FrankenPHP 1.5 本身不支持原生的“慢请求日志”(slow request log)功能,它没有类似 Nginx 的 slow_log 或 PHP-FPM 的 slowlog 配置项。它的日志体系分三层,而“慢请求”判定和记录需由上层组件(Caddy)或应用层自行实现,不能靠 FrankenPHP 二进制直接开启。
下面分三类场景说明可行方案:
✅ 用 Caddy 的 log + handle 配合 vars 实现基础慢请求标记
FrankenPHP 基于 Caddy v2,可利用 Caddy 的变量和条件日志能力,在响应完成后判断耗时并打标(但不自动分离文件,需后续过滤):
example.com {
handle {
# 记录开始时间(毫秒级)
vars time_start {http.request.time.unixnano}
reverse_proxy http://localhost:8080 {
# 把原始请求透传给 FrankenPHP
}
# 响应后计算耗时(单位:毫秒)
vars time_elapsed {http.response.header.X-Response-Time}
# 可选:在响应头中注入耗时(便于调试)
header X-Response-Time {http.response.duration.ms}
}
log {
# 全量记录,但可在 output 后用 grep 或日志采集器筛选
output file /var/log/frankenphp/access.log
format json
}
}
⚠️ 注意:FrankenPHP 不自动设置 X-Response-Time,你需在 PHP 应用入口手动注入:
// public/index.php 开头
$start = hrtime(true);
register_shutdown_function(function() use ($start) {
$elapsed_ms = round((hrtime(true) - $start) / 1_000_000, 2);
if ($elapsed_ms > 1000) { // 慢于 1s
error_log("[SLOW] " . $_SERVER['REQUEST_URI'] . " took {$elapsed_ms}ms");
}
header("X-Response-Time: {$elapsed_ms}");
});
✅ 在 PHP 应用层主动记录慢请求(推荐、最可控)
这是生产环境最可靠的方式,不依赖服务器配置,逻辑清晰且可分级:
- 在框架中间件或裸脚本开头/结尾埋点;
- 使用
hrtime(true)获取纳秒级精度; - 达到阈值后写入独立慢日志文件(注意加锁或用
file_put_contents(..., FILE_APPEND | LOCK_EX));
示例(无框架):
$threshold_ms = 1500;
$start = hrtime(true);
// ... 执行业务逻辑 ...
$end = hrtime(true);
$ms = round(($end - $start) / 1_000_000, 2);
if ($ms > $threshold_ms) {
$log_line = sprintf(
"[%s] %s %s %dms %s\n",
date('c'),
$_SERVER['REQUEST_METHOD'],
$_SERVER['REQUEST_URI'],
$ms,
$_SERVER['HTTP_USER_AGENT'] ?? '-'
);
file_put_contents('/var/log/frankenphp/slow.log', $log_line, FILE_APPEND | LOCK_EX);
}
✅ 优点:
- 精确控制阈值(如
/api/*设 500ms,静态资源设 50ms); - 可记录上下文(SQL 查询、Redis 耗时、Trace ID);
- 不受 Caddy 或 FrankenPHP 版本限制。
⚠️ 不可行的常见误区
- ❌ 在
frankenphp.yaml中加slow_log: /path—— 该字段不存在,FrankenPHP 会忽略或报错; - ❌ 试图用
log_access配合正则过滤慢请求 ——log_access格式固定且无条件写入,不支持耗时字段; - ❌ 依赖
php.ini的request_slowlog_timeout—— 这是 PHP-FPM 特有指令,FrankenPHP 完全不识别。
综上,FrankenPHP 1.5 没有内置慢日志开关。真正落地要靠:
- Caddy 层做耗时透传 + JSON 日志 + 外部工具(如
awk '$9 > 1000')实时筛选; - 或更推荐:在 PHP 入口统一埋点,按需写入独立 slow.log —— 简单、稳定、可扩展。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











