frankenphp后台运行不等于启用worker模式,必须显式配置php_worker指令、--script参数或frankenphp_worker=1配合frankenphp run,且worker.php中需调用frankenphp_handle_request()并把初始化逻辑置于循环外,否则仍为per-request模式。

不是。 FrankenPHP 后台运行(比如用 nohup、systemd 或 & 启动)只代表进程不随终端退出而终止,和是否启用 Worker 模式完全无关。它默认仍是 per-request 模式,每次请求都新建 PHP 实例,和传统 CGI 行为一致。
FrankenPHP 的 Worker 模式必须显式启用
Worker 模式不是后台运行的副作用,而是需要主动配置的执行模型:
- Caddyfile 中必须写
php_worker或worker指令(取决于 FrankenPHP 版本),且路径必须是绝对路径,例如php_worker /var/www/app/public/worker.php - 独立二进制启动时必须用
frankenphp-worker --script /app/public/worker.php --addr :8080,漏掉--script会直接报错flag needs an argument: --script - 环境变量方式需设
FRANKENPHP_WORKER=1,但仅此不够——还必须配合frankenphp run(不是serve),否则 worker 不加载
为什么容易误以为“后台运行 = Worker”
常见混淆点来自观察表象:
- 看到
ps aux | grep frankenphp有长期存在的进程,就认为“已经在常驻”——其实那只是 Caddy 主进程或普通 PHP 子进程,未必在处理请求循环 - 用
frankenphp php-server &启动后发现没报错,就默认启用了 worker——但php-server默认走的是 FastCGI 兼容模式,不带--worker参数时根本不会进入 worker 生命周期 - 日志里出现
Starting PHP worker pool才是真凭据;没这句,哪怕进程挂了三天,也还是 per-request
验证 Worker 是否真正生效的三个硬指标
别信启动命令,看 runtime 行为:
- 连续两个 HTTP 请求中,
getmypid()返回相同 PID —— 这说明 PHP 进程被复用 - 入口文件里的
echo "init once";(放在frankenphp_handle_request外层)只输出一次,后续请求不再出现 - 在控制器里打印
microtime(true),首次请求耗时 120ms(含 Kernel::boot),后续稳定在 8–15ms(纯请求处理)
最容易被忽略的是:即使你写了 php_worker,如果指向的 worker.php 里没调用 frankenphp_handle_request(),或者没把框架初始化逻辑放到循环外,那也只是“假常驻”——进程虽在,但每次请求仍重建容器、重连数据库,性能毫无提升,还更容易出状态污染。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











