不是。FrankenPHP每个Worker进程同一时刻只处理一个PHP请求,采用同步阻塞模型,通过一次初始化、循环复用框架和连接来降低开销,并发依赖Worker数量而非单进程多路复用。

FrankenPHP 的 worker 模式不是让单个 PHP 进程“同时处理多个请求”,而是让一个 PHP 进程**重复处理多个请求**,每次只干一件,但省掉重复初始化的开销。
核心机制:一次加载,循环复用
传统 PHP-FPM 每次请求都重新 include 入口文件、重建框架容器、重连数据库;而 worker 模式下,入口脚本(如 public/worker.php)只执行一次——框架启动、类预加载、配置解析、APCu/opcache 初始化全在这一轮完成。之后所有请求都通过 frankenphp_handle_request() 调度进来,在同一个 PHP 进程内串行执行。
这就像把厨房搭好后不再拆,客人来了直接炒菜,不用每次点单都重砌灶台、洗菜切肉。
长运行靠 while(true),不是 FrankenPHP 自己维持
Caddy 才是生命周期管理者。只要 Caddyfile 里写了 php_worker 指令,它就会把 PHP 进程当作必须常驻的服务来盯梢:
立即学习“PHP免费学习笔记(深入)”;
- 脚本末尾没写 while (true) { frankenphp_handle_request(); }?执行完就退出 → Caddy 立刻拉起新进程
- 循环里写了 break 或 return?等同于退出 → 同样触发补位
- 环境变量 FRANKENPHP_WORKER=1 没传给 frankenphp run?worker 模式压根不激活,Caddy 可能降级为普通 CGI
每个 Worker 是同步阻塞的,不是协程或多路复用
FrankenPHP 的每个 worker 进程同一时间只能处理一个 HTTP 请求:
- 收到请求 → 执行完整 PHP 生命周期(request_startup 到 request_shutdown)→ 返回响应 → 等待下一个
- 没有自动挂起/恢复机制,不支持 async/await 原生调度
- 并发能力取决于你配了多少个 worker(frankenphp.workers),而不是单个 worker 能不能“并发”
它和 PHP-FPM 的 static 模式行为一致,只是调度器从 Unix fork 换成了 Go 的 goroutine + HTTP server。
复用的是结构,不是状态——残留问题得手动清
worker 模式复用的是类定义、opcache 预加载、配置解析结果,但不会自动重置运行时数据:
- static $cache = []; 会跨请求累积,不清理就污染后续请求
- PDO 实例、Redis 连接、全局变量、$_SESSION 等仍需在每次请求后显式关闭或重置
- Laravel 需调用 $app->resetResolvedInstances() 和 $app->forgetInstance('request')
- 记得加 gc_collect_cycles(),尤其处理大数组或对象图后
这不是 bug,是设计取舍:FrankenPHP 提供复用能力,但把状态隔离的责任交还给开发者。



















