验证FrankenPHP 1.3 worker模式是否生效,需确认四点:启动日志含“Starting PHP worker pool”、/metrics中frankenphp_workers_total匹配配置值、/debug/lifecycle接口返回相同pid/log_id且booted恒为true、ps观察到稳定数量的frankenphp-worker子进程。

要验证 FrankenPHP 1.3 的 worker 模式是否真正生效,不能只看配置写了没写,关键得看运行时行为是否符合常驻语义:进程不退出、框架只初始化一次、对象复用、连接复用、耗时稳定。以下是四个直接有效的验证方式:
看启动日志里有没有明确的 worker 启动提示
worker 模式启用成功时,FrankenPHP 启动日志中必须出现类似这样的行:Starting PHP worker pool with 4 workers
如果只看到 Starting FrankenPHP server 或 Starting Caddy,说明 worker 没启用。常见原因包括:
-
FRANKENPHP_WORKER=1环境变量未设置(必须显式传入,如FRANKENPHP_WORKER=1 frankenphp run) - Caddyfile 中用了
php_server { worker },但没配在顶层frankenphp块下,或写在了reverse_proxy块里 - 使用了
frankenphp serve而非frankenphp run(后者才加载 Caddyfile 和 worker 配置)
检查 /metrics 端点中的线程与 worker 数量
先确保 Caddyfile 中启用了 prometheus 指令(例如 frankenphp { prometheus }),否则访问 http://localhost:2019/metrics 会 404。
成功后,搜索以下指标:
-
frankenphp_workers_total:值应等于你配置的 worker 数(如worker { num 4 }→ 显示4) -
frankenphp_threads_total:对应num_threads配置(注意不是 worker 数,是每个 worker 内部的 PHP 线程数) -
frankenphp_threads_busy:初始为 0,发起请求后缓慢上升,证明线程被调度
若 frankenphp_workers_total 为 0 或远低于预期,说明 worker 模块根本没加载。
验证框架是否真正复用容器和单例
写一个临时接口(如 /debug/lifecycle),返回:
[
'booted' => app()->isBooted(),
'log_id' => spl_object_id(app('log')),
'pid' => getmypid(),
]用 curl 连续请求两次:
立即学习“PHP免费学习笔记(深入)”;
curl http://localhost/debug/lifecycle && echo && curl http://localhost/debug/lifecycle
✅ 正确表现是:
-
booted全为true(第二次不能还是false) -
log_id两次完全相同(说明app('log')是同一个实例) -
pid两次完全相同(证明是同一 PHP 进程处理,不是新进程)
❌ 如果log_id变了、booted第二次是false、或pid不同,说明生命周期没接管,worker 模式形同虚设。
观察进程树和稳定性
执行:
ps aux | grep frankenphp
正常应看到:
- 一个主进程(如
frankenphp run --config ...) - 若干
frankenphp-worker子进程(数量匹配配置)
再用watch -n 1 'ps aux | grep frankenphp | grep -v grep | wc -l'观察 30 秒: - 进程总数应基本稳定(比如一直是 5 个)
- 如果数字频繁跳变(如 5→1→5→1),说明 worker 进程不断崩溃重启,常见于:
-
worker.php脚本里没写while (true) { frankenphp_handle_request(); } -
vendor/bin/frankenphp-worker.php文件损坏或未重生成(改过.env或配置后必须重装) - PHP 扩展缺失或不兼容(如 opcache 未启用、
opcache.enable=1没通过--php-flags传入)
-
不复杂但容易忽略。



















