核心差异在于PHP运行时是否跨请求复用:classic模式每次请求全新初始化并销毁,worker模式常驻内存、复用类加载/配置/连接等,但需手动清理static变量和全局状态。

FrankenPHP 的 worker 模式和 classic 模式,核心差异在于 PHP 运行时是否跨请求复用。
classic 模式本质是 FrankenPHP 对 PHP-FPM 行为的模拟:每次 HTTP 请求都启动一个全新 PHP 执行环境,加载全部类、重建全局变量、重连数据库、重新解析配置,请求结束即销毁全部状态。它适合零改造迁移,但性能开销大,尤其对 Laravel、Symfony 等重型框架,冷启动耗时明显。
worker 模式则让 PHP 进程常驻内存,入口脚本(如 public/worker.php)只执行一次,后续所有请求通过 frankenphp_handle_request() 调度进同一个 PHP 进程。这意味着:
- ✅ 类定义、OPcache 预加载、APCu 缓存、配置解析等只做一次
- ✅ 框架引导(如
Kernel::boot())、服务容器初始化可复用 - ✅ PDO/Redis 连接可手动复用(需显式管理生命周期)
- ❌ 但
static变量、$GLOBALS、未 unset 的对象、session 启动等仍会残留,造成数据污染或报错
简单说:classic 是“每个请求都重装系统”,worker 是“系统一直开着,你只换桌面应用”——省了开机时间,但也得自己清理上一个用户的临时文件。
立即学习“PHP免费学习笔记(深入)”;
关键限制也很明确:
-
frankenphp_handle_request()不会自动重置运行时状态 - 没有类似 Swoole 的
onWorkerStart或自动 reset 钩子 -
pm.max_requests依然生效,进程仍会被强制重启 -
chdir()会永久改变当前工作目录,影响后续所有请求
所以选哪种,不只看性能,更要看你能否承担状态管理责任。



















