经典模式能零改动是因为FrankenPHP仅替代Nginx+PHP-FPM为单进程,仍按传统CGI每次完整启动Laravel;Worker模式需常驻内存、复用容器,要求代码无状态、改入口、装octane包,并禁用session自动启动等不兼容功能。

不能。Worker模式不是零改动,必须改代码、装包、满足无状态约束。
为什么经典模式能零改动,而Worker模式不行
经典模式下,FrankenPHP只是把 Nginx + PHP-FPM 替换为一个进程,public/index.php 仍按传统 CGI 方式每次请求都完整启动 Laravel;Worker 模式则要求 PHP 进程常驻内存,框架只初始化一次,后续请求复用已加载的容器和服务——这直接打破“每次请求都是干净环境”的假设。
- 所有全局变量、静态属性、单例对象在请求间持续存在,Laravel 的
app()容器、配置缓存、事件监听器都会跨请求残留 - 未显式清理的数据库连接、Redis 连接池、日志 Handler 可能复用或泄漏
- Session、Cookie、Request 对象必须由 Worker 主动注入,不能依赖
$_SERVER或全局超全局变量
Laravel 项目启用 Worker 模式要做的三件事
不改代码就跑 Worker,大概率出现 500 错误、内存暴涨、并发错乱、中间件失效等问题。
- 安装官方支持包:
composer require laravel/octane(FrankenPHP Worker 模式与 Octane 兼容,但不用 Octane CLI,只用其frankenphp驱动) - 入口文件改写:把
public/index.php替换为 Octane 提供的frankenphp-worker入口逻辑,核心是包裹frankenphp_handle_request() - 禁用不兼容功能:关闭
session_start()自动调用、移除手动register_shutdown_function清理逻辑、避免在服务提供者里写一次性初始化代码(如file_put_contents写日志)
最容易被忽略的两个坑
很多团队卡在这两步上,反复重启服务却始终报 Class 'Laravel\Octane\Worker' not found 或 Request has been resolved more than once。
立即学习“PHP免费学习笔记(深入)”;
-
FRANKENPHP_CONFIG环境变量没设对:Worker 模式必须在 Caddyfile 的frankenphp全局块里显式启用worker { file "public/worker.php" },且public/worker.php必须存在并返回合法的frankenphp_handle_request()调用链 - 缓存路径未隔离:
storage/framework/cache和bootstrap/cache/config.php在多 Worker 进程间共享,若缓存内容含进程敏感数据(如临时路径、PID),会导致冲突;建议用 Redis 驱动替代文件缓存
Worker 模式的价值真实存在,但它的“一行不改”只适用于刚初始化完 laravel/octane 并严格遵循无状态规范的新项目。老项目迁移前,先跑通经典模式,再逐个模块检查生命周期行为——这才是可落地的路径。



















