Laravel Octane 常驻内存:用 Swoole 把请求延迟打下来
test12026-10-141 次阅读
常驻内存意味着什么
传统 PHP-FPM 每次请求都要重新加载框架、重新连接数据库、重新解析路由,开销固定且重复。Laravel Octane 用 Swoole 或 RoadRunner 把应用常驻进内存,启动一次后反复服务请求,框架引导成本被摊薄到极低,吞吐和延迟都能上一个台阶。代价是:全局状态会在请求之间残留,代码必须写成「无状态」的。
安装与启动
# 需要本机先装好 swoole 扩展(pecl install swoole)
composer require laravel/octane
php artisan octane:install --server=swoole
php artisan octane:start --port=8000
生产建议用 supervisor 看管进程,并加上 worker 数与任务超时:
php artisan octane:start --server=swoole \
--workers=4 \
--task-workers=4 \
--max-requests=1000
避开全局状态陷阱
最典型的坑:把请求级数据塞进单例或静态变量,下一个请求会读到上一个用户的脏数据。下面是错误的写法与正确写法。
<?php
// 错误:把当前用户缓存到静态属性,跨请求泄漏
class BadAuth
{
protected static ?User $user = null;
public static function user(): ?User
{
if (self::$user === null) {
self::$user = Auth::user();
}
return self::$user;
}
}
<?php
// 正确:每次都从请求上下文取,或注册到容器并标记请求作用域
use Illuminate\Support\Facades\Auth;
class GoodAuth
{
public function user(): ?\App\Models\User
{
return Auth::user(); // 每次实时解析,不跨请求保留
}
}
若确实要在常驻环境复用重对象(如客户端实例),用 Octane 提供的 reset 钩子在每轮请求后清理:
<?php
use Laravel\Octane\Events\RequestTerminated;
use Illuminate\Support\Facades\Event;
Event::listen(RequestTerminated::class, function () {
// 清掉可能残留的静态引用
SomeStaticCache::clear();
});
Swoole 还是 RoadRunner
Swoole 是 PHP 扩展,性能极高、能力全(协程、表、通道),但二进制安装门槛高。RoadRunner 是 Go 写的独立服务器,用 composer 就能装、跨平台友好,生态更「标准」。新项目想要最少依赖选 RoadRunner,追求极限并发和协程能力选 Swoole。
压测对比参考
同样的 CRUD 接口,FPM 下约 300 RPS、P99 在百毫秒级;切到 Octane + Swoole 后常见能到数千 RPS、P99 降到十毫秒级,前提是业务逻辑里没有上述全局状态泄漏。上线前务必用 wrk 或 hey 打一轮,确认没有跨请求脏读,再放量。
T
test1
文章作者
常驻内存意味着什么 传统 PHP-FPM 每次请求都要重新加载框架、重新连接数据库、重新解析路由,开销固定且重复。La...
- 分类
- 技术
- 发布时间
- 2026-10-14
- 字数
- 约 1564 字
- 阅读
- 1 次
