frankenphp监控依赖caddy metrics模块,需在全局配置块中启用127.0.0.1:2019端点;关键指标包括frankenphp_total_threads、frankenphp_busy_threads、frankenphp_queue_depth及php_opcache_memory_usage_bytes;prometheus可直采该端点,grafana推荐导入id 18294仪表盘;php内存埋点应限于高负载worker并使用memory_get_usage(true)。

确认 metrics 端点是否暴露且可访问
FrankenPHP 本身不提供独立监控命令,它的指标完全依赖 Caddy 的 metrics 模块暴露。如果没看到 /metrics 响应,不是监控没配好,而是端点根本没开。
检查 Caddyfile 是否包含全局 metrics 块(不是在站点块里):
{
metrics 127.0.0.1:2019
frankenphp {
num_threads auto
}
}
- 必须写在
{ }全局配置块内,写在example.com { }里无效 - 绑定地址建议限定为
127.0.0.1:2019,避免公网暴露敏感指标 - 若用 YAML 配置(
frankenphp.yaml),需确保admin.metrics启用且地址未被覆盖 - 重启 Caddy 后执行
curl -s http://127.0.0.1:2019/metrics | head -5,应返回 Prometheus 格式文本,含frankenphp_前缀指标
抓取关键指标:别只看 CPU,重点盯线程池水位
系统级 top 或 ps 只能告诉你 FrankenPHP 进程吃多少资源,但无法反映 PHP 请求处理瓶颈。真正影响线上稳定的是它内部的线程调度行为。
从 /metrics 中重点关注以下几项:
-
frankenphp_total_threads和frankenphp_busy_threads:比值持续 > 0.8 说明线程池长期饱和,可能触发排队或超时 -
frankenphp_queue_depth:非零值代表请求已在队列中等待,> 5 且持续上升是严重信号 -
frankenphp_worker_requests_total{status="5xx"}:区分是 PHP 脚本崩溃还是超时导致的 500 -
php_opcache_memory_usage_bytes:OPcache 内存使用率过高(> 90%)会引发频繁重编译,拖慢响应
对接 Prometheus + Grafana:用现成 exporter 就行,不用改代码
FrankenPHP 不需要额外装 exporter。只要 Caddy 的 metrics 端点开着,Prometheus 就能直接 scrape。
在 Prometheus scrape_configs 中加一段即可:
scrape_configs:
- job_name: 'frankenphp'
static_configs:
- targets: ['127.0.0.1:2019']
- 目标地址必须和 Caddyfile 中
metrics绑定的地址一致(如127.0.0.1:2019) - 如果 FrankenPHP 运行在 Docker 容器里,
targets应填宿主机 IP 或容器网络可达地址,不能写localhost - Grafana 推荐导入 ID 为
18294的 FrankenPHP Dashboard(社区维护,适配最新指标命名) - 避免把
/metrics暴露到公网——Prometheus 抓取走内网,前端 Grafana 做权限隔离
PHP 层埋点要克制:只在可疑 Worker 里加 memory_get_usage
全局打日志或每请求调用 memory_get_usage() 会显著拖慢性能,得不偿失。只在已知高负载 Worker(如长任务、文件处理)里做条件检测。
例如,在 Laravel Octane Worker 或自定义 frankenphp_handle_request 循环中插入:
$limit = (int)ini_get('memory_limit');
$limit_bytes = $limit === -1 ? 512 * 1024 * 1024 : $limit * 1024 * 1024;
$usage = memory_get_usage(true);
if ($usage > 0.85 * $limit_bytes) {
error_log(sprintf('High memory usage: %.1f MB / %.1f MB', $usage / 1024 / 1024, $limit_bytes / 1024 / 1024));
}
- 用
memory_get_usage(true),不是false,前者含未分配但已保留的内存块 - 阈值设为 85%,留出缓冲空间,避免刚过限就 OOM
- 不要在
index.php入口无差别埋点——90% 的请求根本不需要
监控生效的关键不在指标数量,而在能否快速定位“是线程不够?还是某个脚本内存疯涨?或是 OPcache 编译卡住了?”。Caddy metrics 提供了第一层信号,memory_get_usage 是最后一道人工探针,中间那层——比如哪个路由平均耗时突增——得靠应用层日志或 APM 工具补全。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











