はじめに
Laravelは使いやすさと優れた開発体験で人気のPHPフレームワークですが、従来のPHPアプリケーションは1リクエストごとにブートストラップが必要なため、パフォーマンス面で課題がありました。Laravel Octaneはこの問題に対する解決策として登場し、アプリケーションを常駐させることでリクエスト間でアプリケーション状態を保持し、大幅なパフォーマンス向上を実現します。この記事では、Laravel Octaneの導入方法から実践的な最適化テクニックまでを解説します。
Laravel Octaneとは?
Laravel Octaneは、アプリケーションをメモリに常駐させ、リクエスト間でアプリケーション状態を保持することで、従来のPHPアプリケーションの起動オーバーヘッドを排除するサーバーです。RoadRunnerやSwooleというサーバー技術を利用して、Laravelアプリケーションを「事前起動」させ、リクエスト処理速度を劇的に向上させます。
主な特徴
- リクエスト処理の高速化: アプリケーションを事前に起動し、リクエスト間でブートストラップを省略
- 並行リクエスト処理: 複数のワーカープロセスによる効率的なリクエスト処理
- メモリ効率の向上: アプリケーション状態をメモリに保持することによる効率化
- リアルタイム機能: WebSocketsのサポートによるリアルタイム機能の実装
インストールと設定
前提条件
- PHP 8.0以上
- Laravel 8.0以上
- Composer
インストール手順
- Composerを使ってOctaneをインストール
composer require laravel/octane
- Octaneのインストールコマンドを実行
php artisan octane:install
インストール時に、RoadRunnerかSwooleのどちらかを選択するように求められます。
RoadRunnerのセットアップ
RoadRunnerを選択した場合、Goで書かれた軽量のアプリケーションサーバーをセットアップします。
- RoadRunnerのバイナリをダウンロード
./vendor/bin/rr get-binary
- RoadRunnerの設定ファイルを確認(
.rr.yaml
)
server:
command: "php ./vendor/bin/roadrunner-worker"
relay: "pipes"
http:
address: "0.0.0.0:8000"
middleware: ["static", "headers", "gzip"]
static:
dir: "public"
forbid: [".php", ".htaccess"]
pool:
num_workers: 8
max_jobs: 64
Swooleのセットアップ
Swooleを選択した場合、PHPの拡張モジュールとしてインストールします。
- Swoole拡張をインストール
pecl install swoole
php.ini
に拡張を追加
extension=swoole.so
Octaneサーバーの起動
インストールが完了したら、以下のコマンドでOctaneサーバーを起動します。
php artisan octane:start
デフォルトでは、サーバーはhttp://localhost:8000
で起動します。
パフォーマンス最適化のテクニック
1. ワーカー数の調整
サーバーマシンのCPUコア数に応じてワーカー数を最適化します。
php artisan octane:start --workers=12 --task-workers=4
一般的な目安として、(CPUコア数 × 2)程度のワーカー数が最適とされていますが、実際の負荷テストで調整するのがベストです。
2. キャッシュドライバの最適化
Octaneでは、リクエスト間でアプリケーション状態が保持されるため、APCuやRedisなどの高速なキャッシュドライバの利用が効果的です。
// config/cache.php
'default' => env('CACHE_DRIVER', 'redis'),
3. データベース接続プールの活用
Swooleを使用している場合、データベース接続プールを活用して接続オーバーヘッドを削減できます。
// config/octane.php
'tables' => [
'mysql' => [
'pool' => [
'enabled' => true,
'size' => 20, // 接続プールのサイズ
],
],
],
4. Octaneでの注意点と状態管理
Octaneでは、リクエスト間でアプリケーション状態が保持されるため、グローバル状態に依存するコードには注意が必要です。
// config/octane.php
'listeners' => [
// リクエスト後に状態をリセットするリスナー
Listeners\FlushTemporaryContainerInstances::class,
Listeners\ResetSessionAfterRequest::class,
Listeners\FlushQueuedCookies::class,
// その他必要なリスナー
],
5. タスクワーカーの活用
時間のかかる処理をタスクワーカーに委任することで、メインのリクエスト処理を高速に保ちます。
use Laravel\Octane\Facades\Octane;
Octane::concurrently([
function () {
// 重い処理1
return processHeavyTask1();
},
function () {
// 重い処理2
return processHeavyTask2();
},
], function ($results) {
// 処理結果を利用
[$result1, $result2] = $results;
// ...
});
実際のパフォーマンス向上効果
ベンチマーク結果の例
以下は、一般的なLaravelアプリケーションでのOctane導入前後のベンチマーク結果例です。
構成 | リクエスト/秒 | レイテンシ(ms) |
---|---|---|
従来のPHP-FPM | 120 | 250 |
Octane + RoadRunner | 580 | 52 |
Octane + Swoole | 620 | 48 |
※環境や実装によって結果は大きく異なりますが、一般的に4〜10倍のパフォーマンス向上が期待できます。
本番環境でのデプロイと運用
Supervisorを使った常時実行
本番環境では、Supervisorを使ってOctaneプロセスを管理します。
[program:octane]
process_name=%(program_name)s
command=php /path/to/your/app/artisan octane:start --server=swoole --host=0.0.0.0 --port=8000
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/path/to/your/app/storage/logs/octane.log
Nginxでのリバースプロキシ設定
Nginxをリバースプロキシとして使用する場合の設定例:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_cache_bypass $http_upgrade;
}
}
ゼロダウンタイムデプロイ
Octaneアプリケーションを再起動せずに更新するには:
php artisan octane:reload
または特定のファイルが変更されたときに自動リロードする設定:
php artisan octane:start --watch
高度な最適化テクニック
1. Octaneティッカーの活用
定期的に実行される処理をティッカーとして登録できます。
// AppServiceProvider.php
public function boot()
{
Octane::tick('cache-cleanup', function () {
// 5分ごとに実行される処理
Cache::cleanup();
})->seconds(300);
}
2. イベントリスナーのネイティブ移行
Laravel Octaneのネイティブイベントサーバーを使用して、WebSocketイベントを処理します。
// config/octane.php
'swoole' => [
'options' => [
'websocket_handler' => App\WebSockets\Handler::class,
],
],
3. JITコンパイラの活用
PHP 8.0以降で利用可能なJIT(Just-In-Time)コンパイラを有効にして、さらなる高速化を図ります。
; php.ini
opcache.jit_buffer_size=100M
opcache.jit=1235
よくある問題と解決策
1. メモリリーク
長時間の運用でメモリ使用量が増加する場合は、以下を確認してください。
- グローバル変数や静的プロパティの使用を避ける
- キャッシュの有効期限を適切に設定する
- 定期的なワーカーの再起動をスケジュールする
php artisan octane:start --max-requests=1000
2. 非同期処理のハンドリング
非同期処理を行う場合は、適切なクロージャシリアライゼーションが必要です。
use Illuminate\Queue\SerializesModels;
$job = new class {
use SerializesModels;
public $model;
public function __construct($model)
{
$this->model = $model;
}
};
3. セッション管理
セッションデータがリクエスト間で正しく更新されない場合は、適切なリスナーを設定します。
// config/octane.php
'listeners' => [
// 他のリスナー...
Listeners\ResetSessionAfterRequest::class,
],
まとめ
Laravel Octaneは、従来のPHPアプリケーションの限界を超え、Node.jsやGoなどの常駐型サーバーに匹敵するパフォーマンスを実現します。適切に設定・最適化することで、レスポンス時間を大幅に短縮し、サーバーリソースの効率的な使用が可能になります。
特に高トラフィックのウェブサイトやAPIサーバー、リアルタイム機能を必要とするアプリケーションにおいて、Laravel Octaneの導入は大きなメリットをもたらします。フレームワークの使いやすさを維持しながら、パフォーマンスを大幅に向上させることができるため、多くのLaravelプロジェクトで採用される価値があります。
ただし、アプリケーションの状態管理には注意が必要であり、適切なテストと監視を行いながら導入していくことが重要です。本記事で紹介した最適化テクニックを活用し、Laravelアプリケーションを「爆速化」してみてください。
コメント