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 次