# Laravel Octane 2026完全ガイド:SwooleとRoadRunnerによるパフォーマンス最適化 > Laravel Octaneを使用したハイパフォーマンスPHPアプリケーションの構築方法を解説。SwooleとRoadRunnerの違い、設定方法、ベストプラクティス、面接対策まで網羅的に解説します。 - Published: 2026-09-11 - Updated: 2026-09-11 - Author: Anthony Fillion-Maillet - Tags: laravel, octane, swoole, roadrunner, php, performance - Reading time: 12 min --- 2026年現在、Laravel Octaneは高性能PHPアプリケーションを構築するための標準的なソリューションとして確立されています。従来のPHP-FPM環境では、リクエストごとにアプリケーション全体がブートストラップされていましたが、Octaneは常駐プロセスモデルを採用することで、このオーバーヘッドを完全に排除します。Octane 3.xでは、SwooleとRoadRunnerの両方をドライバとしてサポートし、開発者はプロジェクトの要件に応じて最適なランタイムを選択できます。本記事では、Laravel Octaneのアーキテクチャ、両ドライバの違い、パフォーマンス最適化手法、そして2026年の技術面接でよく問われる質問について詳しく解説します。 > **Laravel Octaneとは** > > Laravel Octaneは、SwooleまたはRoadRunnerをベースにした高性能アプリケーションサーバーです。アプリケーションを一度メモリにロードし、その後のリクエストでは既にブートストラップされた状態から処理を開始します。これにより、従来のPHP-FPM環境と比較して、レスポンス時間を最大10倍高速化できます。また、WebSocket、タスクサーバー、並行処理などの高度な機能も提供します。 ## Laravel Octaneのアーキテクチャと動作原理 Laravel Octaneの核心は、アプリケーションの「常駐プロセス」モデルにあります。従来のPHP-FPM環境では、HTTPリクエストを受信するたびにPHPインタプリタがアプリケーションコードを読み込み、サービスコンテナを構築し、ミドルウェアを登録する必要がありました。この初期化プロセスは、シンプルなアプリケーションでも50〜100ミリ秒のオーバーヘッドを生み出します。 Octaneでは、ワーカープロセスがアプリケーションを一度だけブートストラップし、メモリ上に保持します。後続のリクエストでは、このブートストラップ済みの状態を再利用するため、初期化オーバーヘッドがほぼゼロになります。 ```php // config/octane.php - Octaneの基本設定 return [ 'server' => env('OCTANE_SERVER', 'swoole'), 'https' => env('OCTANE_HTTPS', false), 'listeners' => [ WorkerStarting::class => [ EnsureUploadedFilesAreValid::class, EnsureUploadedFilesCanBeMoved::class, ], RequestReceived::class => [ // リクエスト受信時のカスタムリスナー ], RequestHandled::class => [ // レスポンス送信後のクリーンアップ ], ], 'warm' => [ // 起動時にプリロードするサービス App\Services\HeavyService::class, App\Repositories\CachedRepository::class, ], 'flush' => [ // リクエストごとにリセットするサービス ], 'workers' => env('OCTANE_WORKERS', 'auto'), 'task_workers' => env('OCTANE_TASK_WORKERS', 'auto'), 'max_requests' => env('OCTANE_MAX_REQUESTS', 1000), 'tick' => true, 'tick_interval' => 10000, // 10秒 ]; ``` この設定では、`warm`配列で指定したサービスが起動時にインスタンス化され、全ワーカーで共有されます。一方、`flush`配列で指定したサービスは、リクエストごとにリセットされ、状態の漏洩を防ぎます。 ## SwooleとRoadRunner:ドライバの比較と選択基準 Laravel Octaneは、SwooleとRoadRunnerという2つのランタイムをサポートしています。それぞれに異なる特性があり、プロジェクトの要件に応じて適切なドライバを選択する必要があります。 | 特性 | Swoole | RoadRunner | |---|---|---| | **言語** | C拡張(PHP) | Go言語 | | **インストール** | PECL拡張が必要 | バイナリダウンロード | | **WebSocket** | ネイティブサポート | プラグインが必要 | | **コルーチン** | 完全サポート | 非対応 | | **メモリ効率** | 優秀 | 良好 | | **macOS対応** | 制限あり | フルサポート | | **Docker対応** | 良好 | 優秀 | SwooleはPHPのC拡張として実装されており、コルーチンによる非同期I/Oを完全にサポートします。データベースクエリやHTTPリクエストを並行して実行でき、I/Oバウンドなアプリケーションで大きなパフォーマンス向上が期待できます。 ```php // Swooleコルーチンを使用した並行処理 use Swoole\Coroutine; use function Swoole\Coroutine\run; run(function () { $results = []; // 3つのAPIコールを並行実行 Coroutine\go(function () use (&$results) { $results['users'] = Http::get('https://api.example.com/users')->json(); }); Coroutine\go(function () use (&$results) { $results['orders'] = Http::get('https://api.example.com/orders')->json(); }); Coroutine\go(function () use (&$results) { $results['products'] = Http::get('https://api.example.com/products')->json(); }); // 全てのコルーチンが完了するまで待機 // 総時間 = max(各リクエスト時間) ≒ 200ms(直列実行なら600ms) }); ``` RoadRunnerはGo言語で実装されたアプリケーションサーバーで、PHPワーカーと通信します。Swooleほどの低レベル制御は提供しませんが、インストールが簡単で、既存のPHPコードとの互換性が高いのが特徴です。 ```yaml # .rr.yaml - RoadRunner設定ファイル version: '3' server: command: 'php artisan octane:start --server=roadrunner --host=0.0.0.0 --port=8000' http: address: 0.0.0.0:8000 middleware: - gzip - headers pool: num_workers: 8 max_jobs: 1000 supervisor: max_worker_memory: 128 # MB exec_ttl: 60s jobs: pool: num_workers: 4 kv: local: driver: memory config: interval: 60 ``` ## パフォーマンス最適化:実践的なテクニック Laravel Octaneで最高のパフォーマンスを引き出すには、アプリケーションの設計パターンを常駐プロセスモデルに適応させる必要があります。最も重要な考慮事項は、状態の漏洩(State Leakage)を防ぐことです。 ### 状態の漏洩を防ぐ 常駐プロセスでは、シングルトンサービスがリクエスト間で共有されます。ユーザー固有のデータをシングルトンに保存すると、他のユーザーのリクエストでそのデータが漏洩する可能性があります。 ```php // 危険な実装 - 状態が漏洩する class UserContextService { private ?User $currentUser = null; public function setUser(User $user): void { $this->currentUser = $user; // 次のリクエストでも残る } public function getUser(): ?User { return $this->currentUser; } } // 安全な実装 - Octane互換 class UserContextService { public function setUser(User $user): void { // リクエストスコープの属性を使用 request()->attributes->set('current_user', $user); } public function getUser(): ?User { return request()->attributes->get('current_user'); } } ``` ### サービスのウォームアップとフラッシュ Octaneでは、`warm`と`flush`設定を使用して、サービスのライフサイクルを細かく制御できます。 ```php // app/Providers/OctaneServiceProvider.php use Laravel\Octane\Facades\Octane; use Laravel\Octane\Events\RequestReceived; use Laravel\Octane\Events\RequestTerminated; class OctaneServiceProvider extends ServiceProvider { public function boot(): void { // リクエスト開始時にリセットが必要なサービス Octane::listen(RequestReceived::class, function ($event) { // ロケールをリセット app()->setLocale(config('app.locale')); // カスタムサービスをリセット app(TenantService::class)->reset(); }); // リクエスト終了時のクリーンアップ Octane::listen(RequestTerminated::class, function ($event) { // 大きなオブジェクトを解放 gc_collect_cycles(); }); } } ``` ### 並行タスクの実行 Octaneの`concurrently`メソッドを使用すると、複数のタスクを並行して実行できます。これは、Swooleドライバでのみ利用可能な機能です。 ```php use Laravel\Octane\Facades\Octane; public function getDashboardData(): array { // 3つのクエリを並行実行 [$users, $orders, $revenue] = Octane::concurrently([ fn () => User::where('active', true)->count(), fn () => Order::whereDate('created_at', today())->get(), fn () => Payment::whereMonth('created_at', now()->month)->sum('amount'), ]); return compact('users', 'orders', 'revenue'); } ``` ### キャッシュとコネクションプーリング ```php // config/database.php - 接続プール設定 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, // Octane用の接続プール設定 'pool' => [ 'min_connections' => 1, 'max_connections' => 10, 'wait_timeout' => 3.0, 'max_idle_time' => 60.0, ], ], ``` ## WebSocketとリアルタイム機能 Laravel Octaneは、SwooleドライバでネイティブのWebSocketサポートを提供します。Laravel Echoと組み合わせることで、リアルタイムアプリケーションを簡単に構築できます。 ```php // routes/websocket.php use Laravel\Octane\Facades\Octane; Octane::route('GET', '/ws', function ($request) { return Octane::webSocket($request, function ($ws) { $ws->on('open', function ($connection) { logger()->info('WebSocket connection opened', [ 'id' => $connection->fd, ]); }); $ws->on('message', function ($connection, $data) { // ブロードキャスト broadcast(new MessageReceived($data)); }); $ws->on('close', function ($connection) { logger()->info('WebSocket connection closed'); }); }); }); ``` ## 面接対策:Laravel Octane関連の質問 2026年のLaravelエンジニア面接では、Octaneに関する知識が頻繁に問われます。以下は、よく出題される質問とその回答です。 **Q1: Laravel OctaneとPHP-FPMの主な違いは何ですか。Octaneを使用するメリットを説明してください。** PHP-FPMは、リクエストごとにPHPプロセスを起動し、アプリケーション全体をブートストラップします。これにより、リクエストごとに50〜100ミリ秒のオーバーヘッドが発生します。一方、Laravel Octaneは常駐プロセスモデルを採用し、アプリケーションを一度だけブートストラップしてメモリに保持します。後続のリクエストでは、このブートストラップ済みの状態を再利用するため、オーバーヘッドがほぼゼロになります。メリットとしては、レスポンス時間の大幅な短縮(最大10倍)、メモリ使用量の削減、WebSocketやコルーチンなどの高度な機能の利用が挙げられます。 **Q2: SwooleとRoadRunnerの違いは何ですか。どのような基準で選択しますか。** SwooleはPHPのC拡張として実装され、コルーチンによる非同期I/Oを完全にサポートします。WebSocketもネイティブでサポートし、最高のパフォーマンスを提供します。ただし、PECL拡張のインストールが必要で、macOSでは制限があります。RoadRunnerはGo言語で実装されたアプリケーションサーバーで、バイナリをダウンロードするだけで使用できます。インストールが簡単で、既存のPHPコードとの互換性が高いですが、コルーチンはサポートしていません。選択基準としては、WebSocketやコルーチンが必要な場合はSwoole、簡単なセットアップと既存コードとの互換性を重視する場合はRoadRunnerを選択します。 **Q3: Octane環境での状態の漏洩(State Leakage)とは何ですか。どのように防ぎますか。** 状態の漏洩とは、あるリクエストで設定された状態が、後続のリクエストに意図せず引き継がれる問題です。常駐プロセスでは、シングルトンサービスがリクエスト間で共有されるため、ユーザー固有のデータをシングルトンに保存すると、他のユーザーのリクエストでそのデータが漏洩する可能性があります。防止策としては、リクエストスコープの属性(`request()->attributes`)を使用する、`config/octane.php`の`flush`配列でリセットが必要なサービスを指定する、`RequestReceived`イベントでサービスの状態をリセットする、静的プロパティの使用を避ける、などがあります。 **Q4: Octaneの`concurrently`メソッドはどのように動作しますか。制限事項は何ですか。** `Octane::concurrently()`メソッドは、複数のクロージャを並行して実行し、すべての結果を配列として返します。内部的にはSwooleのコルーチンを使用しており、I/Oバウンドなタスク(データベースクエリ、HTTPリクエストなど)を効率的に並行実行できます。制限事項としては、Swooleドライバでのみ利用可能であること、クロージャ内でEloquentモデルのリレーションシップを遅延ロードすると問題が発生する可能性があること、同じデータベース接続を複数のコルーチンで共有できないこと、などがあります。 **Q5: 本番環境でOctaneを運用する際のベストプラクティスを説明してください。** 本番環境でOctaneを運用する際は、以下のベストプラクティスに従います。`max_requests`を設定してメモリリークを防ぐ(1000〜10000リクエスト後にワーカーを再起動)、`workers`数をCPUコア数に合わせて設定する、ヘルスチェックエンドポイントを実装してロードバランサーと連携する、Gracefulリスタートを使用してダウンタイムなしでデプロイする(`php artisan octane:reload`)、メモリ使用量を監視し、異常な増加を検出する、ログを適切に設定し、エラーを追跡する、などです。また、Dockerを使用する場合は、シグナルハンドリングを正しく設定することが重要です。 ## プロダクション環境でのデプロイ 本番環境でOctaneを運用する際は、プロセス管理とデプロイ戦略が重要になります。 ```dockerfile # Dockerfile - Octane用のDockerfile FROM php:8.4-cli-alpine # Swoole拡張のインストール RUN apk add --no-cache $PHPIZE_DEPS linux-headers \ && pecl install swoole \ && docker-php-ext-enable swoole # アプリケーションのコピー COPY . /var/www/html WORKDIR /var/www/html # Composerの依存関係インストール RUN composer install --no-dev --optimize-autoloader # キャッシュの最適化 RUN php artisan config:cache \ && php artisan route:cache \ && php artisan view:cache # Octaneサーバーの起動 CMD ["php", "artisan", "octane:start", "--server=swoole", "--host=0.0.0.0", "--port=8000"] ``` ```yaml # docker-compose.yml - 本番環境構成 version: '3.8' services: app: build: . ports: - "8000:8000" environment: - APP_ENV=production - OCTANE_SERVER=swoole - OCTANE_WORKERS=8 - OCTANE_MAX_REQUESTS=1000 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 deploy: replicas: 3 resources: limits: cpus: '2' memory: 512M ``` [PHP](/technologies/php)の最新動向や[Laravel](/technologies/laravel)のその他の高度な機能については、関連記事を参照してください。Octaneのパフォーマンス最適化は、[バックエンド開発](/technologies/backend)全般のスキル向上にも貢献します。 ## まとめ:Laravel Octaneで次世代のパフォーマンスを実現 Laravel Octaneは、PHPアプリケーションのパフォーマンスを劇的に向上させる強力なツールです。2026年現在、Octaneの理解は上級Laravelエンジニアにとって必須のスキルとなっています。 本記事で学んだ主要なポイント: - **常駐プロセスモデル**: アプリケーションを一度ブートストラップし、メモリに保持することで初期化オーバーヘッドを排除 - **ドライバの選択**: Swooleは最高のパフォーマンスとコルーチンサポート、RoadRunnerは簡単なセットアップと互換性を提供 - **状態の漏洩防止**: リクエストスコープの属性を使用し、シングルトンでのユーザー固有データの保存を避ける - **並行処理**: `Octane::concurrently()`を使用してI/Oバウンドなタスクを効率的に並行実行 - **本番運用**: `max_requests`設定、ヘルスチェック、Gracefulリスタートによる信頼性の確保 Octaneを導入することで、既存のLaravelアプリケーションのレスポンス時間を大幅に短縮し、より少ないサーバーリソースで多くのリクエストを処理できるようになります。面接対策としても、Octaneのアーキテクチャと最適化手法を深く理解することが、2026年のLaravelエンジニア職において重要な差別化要因となります。 --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/ja/blog/laravel/laravel-octane-swoole-roadrunner-performance-optimization