frankenphp 是 laravel octane 官方支持的三类服务器之一,自 laravel 9.25+ 原生集成 --server=frankenphp,无需扩展、自动下载二进制、全生命周期由 octane 管理,但需注意常驻内存模型下的状态复用问题。

官方支持已完整落地,FrankenPHP 是 Laravel Octane 官方明确列出且默认适配的三类服务器之一(另两个是 Swoole 和 RoadRunner),无需额外适配层。
Octane 的 frankenphp server 类型是第一等公民
从 Laravel 9.25+ 开始,laravel/octane 包原生内置 --server=frankenphp 选项,所有核心命令(octane:install、octane:start、octane:reload)均直接识别并生成对应逻辑。安装后会在 vendor/bin/frankenphp-worker.php 放置可执行 worker 脚本,并自动写入 config/octane.php 中的 server 配置项为 'frankenphp'。
- 不依赖任何 PHP 扩展(对比 Swoole 需要
swoole扩展,RoadRunner 需要rr二进制) - 启动时自动检测系统是否支持(如 Linux/macOS + PHP ≥ 8.1),Windows 下会明确报错提示需启用 WSL2
-
octane:install内部调用 Go 编译的frankenphp二进制下载逻辑,失败时会输出具体错误(如网络超时、权限不足、vendor/bin不在$PATH)
配置和生命周期管理由 Octane 全权接管
不同于手动运行 FrankenPHP 二进制,php artisan octane:start --server=frankenphp 启动的是 Octane 管理的完整工作流:主进程监听信号、worker 进程池调度、代码热重载、内存泄漏防护(如自动清空 app() 实例缓存)、日志聚合。你不需要自己写 Caddyfile 或调用 frankenphp 命令。
- Octane 会把
FRANKENPHP_WORKER_SCRIPT环境变量注入到每个 worker 进程,指向生成的frankenphp-worker.php -
octane:reload发送SIGHUP给主进程,触发 worker 平滑重启,避免请求中断 - 队列、广播、任务调度等非 HTTP 生命周期仍由独立命令管理(
queue:work、horizon),Octane 不越界
兼容性边界清晰,但容易忽略“无状态”前提
官方支持不等于零改造。FrankenPHP 在 Octane 下运行的是常驻内存模型,所有全局状态($_SERVER、静态属性、单例容器引用)都会跨请求复用。Laravel 官方文档和 octane:install 生成的注释里都明确警告了这点。
- 直接读
$_SERVER['REQUEST_URI']或$_SERVER['HTTPS']会返回首次请求的快照值——必须改用request()->fullUrl()或request()->secure() - 服务提供者
register()方法中基于请求头初始化配置(如多租户 Host 切换)会失效——应移至boot()或中间件 - 未清理的静态数组或闭包引用会导致内存缓慢增长,尤其在长时间运行的 worker 中更明显
真正卡住人的不是安装或启动,而是把“每次请求都全新引导”的惯性思维,切换成“一次引导、多次复用”的状态管理意识。这个转变点,文档写了,但实际 debug 时最容易被跳过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











