要让 laravel octane 正确对接 frankenphp 1.2 的 worker 模式,必须执行 php artisan octane:install --server=frankenphp 生成适配入口和配置,确保 caddyfile 使用 php_server 指令而非 reverse_proxy,并合理设置 pool_size 与 --workers 的层级关系。

要让 Laravel Octane 正确对接 FrankenPHP 1.2 的 Worker 模式,核心不是“连上就行”,而是确保 PHP 执行环境、进程模型和连接生命周期三者对齐。FrankenPHP 不是代理层,它是把 PHP 线程直接嵌进 Caddy 进程里;Octane 则负责在这些线程中调度 Laravel 应用实例。两者必须按约定方式协作,否则会卡在连接池、报错或性能不升反降。
必须装 octane 并显式绑定 frankenphp 驱动
仅装 laravel/octane 不够,必须指定服务器类型为 frankenphp:
- 运行
php artisan octane:install --server=frankenphp—— 这一步会生成适配 FrankenPHP 的frankenphp-worker.php入口、默认Caddyfile和必要配置 - 不要跳过该命令直接写
octane:start --workers=4,否则 Octane 默认走 Swoole,完全绕过 FrankenPHP - 验证是否生效:启动后看日志是否含
Using FrankenPHP server,且 Caddy 进程里应有多个 PHP 线程(ps -T -p $(pgrep caddy) | grep php)
workers.count 和 --workers 要分层配比
FrankenPHP 的 workers.count 是底层线程总数,Octane 的 --workers 是它能启用的应用子进程数,二者不是相等关系:
-
workers.count设在Caddyfile的php_server块内,例如:php_server { worker ./vendor/bin/frankenphp-worker.php pool_size 8 } -
--workers必须 ≤pool_size,推荐初值设为min(4, pool_size),比如pool_size 8就先试--workers=4 - 压测时观察指标:
frankenphp_busy_threads / frankenphp_total_threads持续 >0.8 但 QPS 上不去 → 加大pool_size;比值长期 --workers 节省内存
数据库与连接必须适配常驻生命周期
Worker 模式下,PDO 连接不再随请求销毁,框架默认行为会引发 MySQL server has gone away 或 Too many connections:
- Laravel 中启用持久连接:
DB_PERSISTENT=true(写进.env),并确认doctrine.dbal.auto_close=false - MySQL
max_connections至少设为pool_size × 5(每个 PHP 线程可能复用多条连接),例如pool_size 8→max_connections ≥ 48 - 禁用任何手动
new PDO()或裸调DB::connection()->getPdo(),所有 DB 操作走 Laravel 的连接管理器
Caddyfile 写法不能套用反向代理习惯
常见错误是把 FrankenPHP 当成后端服务去 reverse_proxy,这会让 Worker 模式彻底失效:
- 正确写法是用
php_server指令直通 PHP 文件:php_server { worker ./vendor/bin/frankenphp-worker.php pool_size 8 } -
root * public/必须带末尾斜杠,路径写相对路径(如public/),避免用绝对路径或./public - 不要在
Caddyfile里写reverse_proxy localhost:8000,Octane 启动时不监听 HTTP 端口,它只响应 FrankenPHP 线程的调用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











