frankenphp慢请求排查需结合caddy访问日志(含{http.request.duration})、php慢日志(request_slowlog_timeout)、代码级hrtime计时、worker队列监控及opcache优化。

FrankenPHP 本身基于 PHP 的 SAPI(Server API)扩展,运行在 Caddy 或原生 HTTP 服务器上,排查慢请求需结合其运行模式(Worker 模式或 Web Server 模式)、PHP 日志、Caddy 日志以及系统级观测手段。关键在于:启用耗时日志、定位瓶颈层级(网络/路由/PHP 执行/扩展/IO)、避免仅依赖默认错误日志。
开启 Caddy 的访问日志并记录响应时间
FrankenPHP 常作为 Caddy 的 PHP 后端运行,Caddy 的 log 指令可直接输出每个请求的耗时({http.request.duration})。在 Caddyfile 中配置:
log {
output file /var/log/caddy/access.log
format json {
request>remote_ip {http.request.remote.ip}
request>method {http.request.method}
request>uri {http.request.uri}
status {http.response.status}
bytes {http.response.body.size}
duration {http.request.duration}
user_agent {http.request.header.User-Agent}
}
}这样每条日志都会包含精确到纳秒的 duration 字段,可直接用 jq 或日志分析工具筛选超过阈值(如 1s)的请求:
jq 'select(.duration > 1000000000) | .uri, .duration' /var/log/caddy/access.log
启用 PHP 的慢日志(slowlog)机制
FrankenPHP 兼容 PHP-FPM 风格的配置,可在 php.ini 或 FrankenPHP 的 php-config 中启用慢日志:
-
设置触发阈值:例如
request_slowlog_timeout = 500ms -
指定慢日志路径:如
slowlog = /var/log/php-slow.log - 确保日志目录可写,且 FrankenPHP 进程有权限写入
注意:该功能依赖 PHP 内置的 slowlog 逻辑,仅对 PHP 脚本执行阶段有效(不包括 Caddy 路由、TLS 握手、静态文件服务等),适合定位脚本级性能问题(如死循环、未优化查询、阻塞 IO)。
在 PHP 应用中手动打点计时
对于更细粒度的耗时分析(如某次数据库查询、第三方 API 调用),建议在代码中使用 hrtime(true) 计时:
$start = hrtime(true);
// ... 执行耗时操作
$elapsed = (hrtime(true) - $start) / 1_000_000; // 毫秒
error_log(sprintf('[SLOW] DB query took %.2f ms', $elapsed), 4);搭配 error_log 输出到系统日志或自定义文件,并配合 tail -f 实时观察。也可集成到中间件(如 Laravel 的 LogRequestDuration 或 Symfony 的 KernelEvents::REQUEST),统一记录所有请求总耗时与各阶段拆分。
检查 FrankenPHP Worker 模式下的队列堆积
若使用 Worker 模式(frankenphp:worker),慢请求可能表现为任务积压而非单次超时。此时需关注:
-
Worker 进程数是否不足:通过
ps aux | grep frankenphp-worker查看实际运行数量 -
队列等待时间:FrankenPHP 会将请求放入 Go channel,可通过 Prometheus 指标(如
frankenphp_worker_queue_duration_seconds)监控排队延迟 -
内存与 GC 压力:长时间运行的 Worker 可能因内存增长导致 GC 频繁,用
php -m确认是否启用了opcache和gc_disable()不当调用
建议在生产环境开启 opcache.enable_cli=1 并配置合理 opcache.memory_consumption,减少重复编译开销。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











