Laravel Octane:Swoole / RoadRunner
High Contrast
Dark Mode
Light Mode
Sepia
Forest
1 min read211 words

Laravel Octane:Swoole / RoadRunner

传统 PHP-FPM 模式下,每个 HTTP 请求都要完整启动 Laravel(加载所有服务提供者、绑定、配置)——这个过程耗费 10-50ms。Octane 让应用常驻内存,请求之间复用启动状态,吞吐量提升 5-10 倍。


Octane vs 传统 PHP-FPM

PHP-FPM(传统):
请求 → 启动 PHP → 加载 Laravel → 处理请求 → 释放内存 → 下一个请求
每次请求都重新启动,约 15-30ms 框架启动开销
Laravel Octane(Swoole/RoadRunner):
启动一次 → 常驻内存 → 请求1 → 请求2 → 请求3 ...
框架只启动一次,每个请求约 1-2ms 处理开销

安装

# 安装 Octane
composer require laravel/octane
php artisan octane:install
# 选择 Server:
# [0] RoadRunner(纯 Go,适合 Docker/K8s)
# [1] Swoole(PHP 扩展,性能最高)
# [2] FrankenPHP(基于 Caddy,现代选择)
# 如果选择 Swoole(需要安装 PHP 扩展)
pecl install swoole
# 或用 Docker 镜像:laraveloctane/octane:8.3-swoole
# 如果选择 RoadRunner(不需要扩展)
composer require spiral/roadrunner
./vendor/bin/rr get-binary  # 下载 rr 二进制

启动 Octane

# 开发环境(监听文件变更自动重启)
php artisan octane:serve
php artisan octane:serve --host=0.0.0.0 --port=8000 --watch
# 查看统计
php artisan octane:status
# 停止
php artisan octane:stop
# 重启(部署时)
php artisan octane:reload

Octane 的内存复用陷阱

由于 Octane 的应用实例在请求之间复用,静态变量和单例的状态会泄漏:

// ❌ 危险:静态变量在请求间共享
class UserContext
{
private static ?User $currentUser = null;
public static function set(User $user): void
{
static::$currentUser = $user;  // 请求结束后不清空!
}
}
// ❌ 危险:单例中存储请求状态
class RequestLogger
{
private array $logs = [];  // 单例状态在请求间共享!
public function log(string $message): void
{
$this->logs[] = $message;  // 下一个请求会看到上一个请求的日志
}
}
// ✅ 正确:使用 Laravel 的 Request/Auth(Octane 会在每次请求前重置这些)
// Octane 会自动重置:auth()、session()、request() 等核心 Facade
// ✅ 正确:用 after 回调清理请求级状态
// app/Providers/AppServiceProvider.php
use Laravel\Octane\Facades\Octane;
public function boot(): void
{
Octane::tick('5 seconds', fn() => /* 定时任务 */);
// 每次请求前清理
app()->instance('request_start', microtime(true));
}

config/octane.php 关键配置

return [
'server' => env('OCTANE_SERVER', 'swoole'),
// Worker 数量(等于 CPU 核心数 × 1.5)
'workers' => env('OCTANE_WORKERS', 8),
// 最大请求数(防止内存泄漏,达到后重启 Worker)
'max_requests' => env('OCTANE_MAX_REQUESTS', 1000),
// 文件变更监听(开发模式)
'warm' => [
...Octane::prepareApplicationForNextRequest(),
// 在请求之间预热的服务(减少第一次请求延迟)
],
'swoole' => [
'options' => [
'worker_num'   => env('OCTANE_WORKERS', 8),
'task_worker_num' => 6,        // 异步任务 Worker
'max_request'  => 1000,
'open_http2_protocol' => true, // HTTP/2 支持
],
],
];

性能对比

测试环境:8 核 CPU,16GB RAM,单机部署
PHP-FPM:
并发 100,P50: 45ms,P99: 180ms,QPS: ~800
Laravel Octane (Swoole, 8 workers):
并发 100,P50: 8ms,P99: 35ms,QPS: ~4500
性能提升:约 5-6 倍 QPS,延迟降低 80%

何时使用 Octane

✅ 适合 Octane 的场景:
- 高并发 API 服务(QPS > 200)
- 计算密集型应用(每次请求重新 new 大量对象代价高)
- 需要 WebSocket(Swoole 原生支持)
- 微服务/容器化部署
⚠️ 需要评估的场景:
- 使用了大量第三方包(需要检查 Octane 兼容性)
- 代码中有静态变量(需要改造)
- 复杂的多租户系统(全局状态隔离要特别处理)
❌ 可能不需要 Octane 的场景:
- 低流量应用(< 50 QPS)
- 已经够用,不想引入额外复杂性

下一章文件存储、邮件与通知系统——性能优化完成,下一步是完善 TaskFlow 的支撑系统:文件附件上传、任务提醒邮件、多渠道通知。