必须同时满足Caddy配置php_server { worker }、使用frankenphp run启动、设置FRANKENPHP_WORKER=1环境变量、框架适配worker.php入口,缺一则仍为每次请求重启PHP。

必须配置 php_server { worker }
在你的 Caddyfile 中,不能只写 php_server,必须显式启用 worker 指令:
php_server {
worker
}
这个块要放在对应站点的路由块内(比如 example.com { ... } 里),且确保它覆盖到你的 PHP 入口路径(如 / 或 /index.php)。如果漏掉 worker 这一行,FrankenPHP 就退化为普通 FastCGI 模式。
必须用 frankenphp run 启动
运行命令只能是:
frankenphp run
不是 frankenphp serve,也不是 frankenphp server —— 后两者不支持 worker 模式,只会启动单次生命周期的 HTTP 服务。启动后,日志中必须看到类似:
立即学习“PHP免费学习笔记(深入)”;
Starting PHP worker pool with 4 workers如果只看到 Starting FrankenPHP server 而没有 worker 相关输出,说明没生效。
必须设置 FRANKENPHP_WORKER=1 环境变量
worker 模式依赖该环境变量触发内部初始化逻辑。可在启动前导出:
FRANKENPHP_WORKER=1 frankenphp run
或写入 .env 文件并确保被加载(例如通过 dotenv 工具或 Caddy 的 env 插件)。若未设,即使 Caddyfile 和命令都对,worker 进程也不会拉起。
验证是否真正生效
最直接的办法:在控制器或中间件里打印进程 ID:
echo "PID: " . getmypid() . "\n";
连续发起两个请求(同一会话或快速刷新):
- 如果 PID 相同 → worker 模式已启用,PHP 实例常驻
- 如果 PID 不同 → 仍在普通模式,每次请求新建进程
另外可检查内存使用:worker 模式下,首请求内存略高(加载框架),后续请求峰值内存应明显低于首请求,且稳定不持续上涨(排除内存泄漏前提下)。



















