Laravel Octane将应用从“请求即启”升级为“常驻即用”,通过Swoole/RoadRunner/FrankenPHP实现框架一次加载、连接复用、协程并发,显著降低延迟并提升QPS,但需系统性管控内存、状态、连接及部署细节。

Laravel Octane 不是简单换一个启动命令,而是把整个应用运行模型从“请求即启”变成“常驻即用”。它通过 Swoole、RoadRunner 或 FrankenPHP 让 Laravel 进程长期存活,跳过每次请求重复加载框架、注册服务、解析配置的开销,从而让响应时间从几十毫秒压到个位数,QPS 成倍提升——但高并发下真正跑稳,靠的不只是启动命令,而是对内存、状态、连接和部署细节的系统性把控。
选对驱动:Swoole、RoadRunner 还是 FrankenPHP?
三种底层服务器适用场景不同,不能只看性能数字:
-
Swoole:适合需要 WebSocket、异步任务、协程调度的业务(如实时通知、长轮询),但要求 PHP 环境已编译安装
swoole扩展(php --ri swoole可验证),且开发者需理解协程生命周期 -
RoadRunner:Go 编写,稳定性强、资源占用低、容器部署友好,无需额外 PHP 扩展,只需把
rr二进制放入$PATH;适合 API 网关、微服务后端等强调可靠与横向扩展的场景 - FrankenPHP:原生支持 HTTP/3、Brotli 压缩、提前提示(Early Hints),自带静态文件服务和 HTTPS 终止能力,特别适合现代全栈应用或 Jamstack 后端,安装后自动下载二进制,开发体验最轻量
绕过常驻内存陷阱:状态污染与连接复用
进程不销毁 ≠ 请求间无干扰。以下配置错误会导致 500、会话错乱或数据残留:
- 会话驱动必须脱离文件系统:
SESSION_DRIVER=file在多 worker 下会冲突,应改用redis或database - 日志通道若自定义为固定文件路径(如
fopen('app.log', 'a')),多个进程并发写入会损坏内容;推荐保持LOG_CHANNEL=stack,由 Laravel 日志系统统一管理 - 数据库连接默认不自动重连,长时间空闲可能被 MySQL 断开;在
config/database.php的 MySQL 配置中加入'options' => [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => true],或监听Octane\RequestReceived事件执行健康检查 - 避免在类属性或
static变量中缓存请求数据(如用户信息、分页参数),改用request()或依赖注入方式获取上下文
生产就绪:Nginx 反向代理与进程守护
Octane 启动后监听本地端口(如 127.0.0.1:8000),不能直接暴露给公网,需配合 Nginx 完成真实部署:
立即学习“PHP免费学习笔记(深入)”;
- Nginx 配置中关闭
fastcgi_pass,改用proxy_pass http://127.0.0.1:8000,并添加关键头传递:proxy_set_header Host $host;、proxy_set_header X-Real-IP $remote_addr;、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - 静态资源(CSS/JS/图片)不应经 Octane 处理,应在 Nginx 中直接
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$设置expires 1y并返回文件 - 使用
systemd或Supervisor管理 Octane 主进程,避免崩溃后服务中断;例如 systemd unit 文件中设置Restart=always、RestartSec=5、MemoryLimit=2G防止内存泄漏累积 - 启用热重载仅用于开发:
php artisan octane:start --watch;生产环境禁用,改用php artisan octane:reload实现零停机发布
性能调优:从连接池到缓存预热
单纯启动 Octane 只释放了 30% 潜力,剩下靠针对性优化:
- 数据库连接池不是 Laravel 原生支持,可通过
spiral/database或自定义 PDO 封装实现;至少确保DB_CONNECTION=sqlite这类单文件驱动不用于高并发场景 - 高频不变数据(权限规则、地区列表、站点配置)可在
AppServiceProvider::boot()中一次性加载进静态属性,并用Octane\OperationTerminated事件清理脏数据 - 路由与配置缓存仍有效:
php artisan config:cache && php artisan route:cache必须在octane:start前执行;但.env修改后需重启 Octane 才生效 - 压测时关注
worker_count和max_requests_per_worker参数:Swoole 默认 4 进程,高负载建议设为 CPU 核数 × 2;每 worker 处理 1000–3000 请求后主动重启,防止内存缓慢增长



















