laravel 适配 frankenphp 1.3 worker 模式核心是换启动方式、确保无状态、配置长连接;需安装 laravel/octane 并执行 octane:install --server=frankenphp,启用 db/redis 持久连接,禁用自动关闭,利用 octane 生命周期清理跨请求状态,验证指标与连接复用。

直接上结论:Laravel 适配 FrankenPHP 1.3 的 Worker 模式,核心不是改业务代码,而是换启动方式 + 确保无状态 + 配置长连接。只要走对路径,过程清晰可控。
必须装 laravel/octane 并初始化 FrankenPHP 驱动
FrankenPHP 本身不提供 Laravel 专用的 worker 入口,这部分由 Octane 承担。你不能手动写 worker.php 或改 public/index.php。
- 运行 composer require laravel/octane 安装官方包
- 执行 php artisan octane:install --server=frankenphp —— 这一步会自动生成
vendor/bin/frankenphp-worker.php、配置 Caddyfile 片段,并在config/octane.php中设置'server' => 'frankenphp' - 生成的 worker 入口已内置 Kernel 复用、请求生命周期钩子、超全局变量重置等关键逻辑,无需自己实现
数据库与 Redis 必须启用持久连接
Worker 模式下 PDO 和 Redis 实例被进程复用,不设持久化会导致连接泄漏或 “MySQL server has gone away” 错误。
- Laravel 中开启 DB 持久连接:在 .env 加
DB_PERSISTENT=true(Laravel 10+ 原生支持) - 确认
config/database.php中 MySQL 配置项包含'options' => [PDO::ATTR_PERSISTENT => true](若 env 不生效可兜底加) - Redis 同理:在
config/database.php的 redis 配置里加'persistent' => true,并确保使用RedisManager而非原生 new Redis() - 禁用自动关闭:检查
config/cache.php和config/queue.php中是否含'auto_close' => true类配置,有则设为 false
清理跨请求残留状态
$_SERVER、$_GET、静态属性、单例内部状态不会自动重置,必须靠 Octane 的生命周期事件或框架自身机制兜底。
- 确保
App\Http\Kernel中的中间件不缓存请求数据(如避免在构造函数中保存 $request) - 自定义服务类若含静态属性(如
private static $cache = []),需在Octane::onRequestReceived中清空,或改用 request-scoped 实例 - Session 必须用 redis 或 database 驱动,且禁用
session.auto_start(在 Caddyfile 的 php_server 块中加php_ini session.auto_start 0) - CSRF Token、用户登录态等敏感上下文,依赖 Laravel 自带的
Illuminate\Foundation\Http\Middleware\ValidateCsrfToken和StartSession即可,它们已适配 Octane 生命周期
验证与调试关键点
启动后别只看首页是否打开,要查底层行为是否符合 worker 预期。
- 用 curl http://localhost:2019/metrics | grep frankenphp 查指标:
frankenphp_total_threads应稳定,frankenphp_busy_threads波动但不持续满载,frankenphp_queue_depth接近 0 - 首次请求后执行 php artisan tinker,运行
app('db')->getPdo(),再发一次请求后重试——若返回相同 PDO 对象,说明连接复用成功 - 日志中出现
Class 'App\Kernel' not found或Undefined index: REQUEST_URI,大概率是入口未走 Octane 生成的 worker.php,或 Caddyfile 没启用 worker 指令 - 压测时观察内存增长:用
ps aux --sort=-%mem | head -5监控,稳定运行 1 小时后 RSS 增幅应 ≤50MB;若持续上涨,说明某处资源未释放(常见于未 close 的 file handle、未 unset 的大数组)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











