Octane とは
Laravel Octane は、高性能なアプリケーションサーバーを使って Laravel アプリケーションのパフォーマンスを劇的に向上させるパッケージです。 通常の PHP-FPM では、リクエストのたびにアプリケーションが起動・終了します。Octane ではアプリケーションを一度だけ起動してメモリに保持し、続くリクエストを高速に処理します。 PHP-FPM との最大の違いは、アプリケーションのブート処理(サービスプロバイダの登録など)がリクエストごとに繰り返されない点です。1 回起動すればあとは超高速でリクエストを処理できます。対応サーバー
Octane は以下の 3 つのサーバーをサポートしています。Laravel Cloud では FrankenPHP を使った Octane 運用が推奨されており、フルマネージドでサポートされています。
インストールと設定
パッケージのインストール
Octane の初期設定
config/octane.php が生成されます。
FrankenPHP
FrankenPHP を選択すると Octane が自動でバイナリをダウンロードします。追加の手順は不要です。RoadRunner
RoadRunner を選択すると Octane が自動でバイナリをダウンロードします。Swoole
Swoole は PHP 拡張として PECL でインストールします。起動方法
サーバーの起動
8000 で起動します。http://localhost:8000 でアクセスできます。
サーバーの指定
ワーカー数の指定
ファイル変更の監視
開発中はファイルを変更してもサーバーを再起動しないと反映されません。--watch フラグを使うと自動で再起動します。
その他の管理コマンド
依存性注入の注意点
Octane ではアプリケーションがメモリに保持されるため、サービスプロバイダのregister や boot はサーバー起動時に 1 回しか実行されません。同じアプリケーションインスタンスがリクエスト間で使い回されるため、コンテナやリクエストをオブジェクトのコンストラクタに注入する場合は注意が必要です。
コンテナのインジェクション
シングルトンのコンストラクタにコンテナを直接注入すると、古いコンテナが使い回されます。app() と Container::getInstance() は常に最新のコンテナを返すため安全です。
リクエストのインジェクション
コントローラーメソッドやルートクロージャで
Illuminate\Http\Request をタイプヒントするのは安全です。グローバルヘルパー request() も常に現在のリクエストを返します。設定リポジトリのインジェクション
config() は常に最新の設定リポジトリを返すため安全です。
メモリリーク対策
Octane はアプリケーションをメモリに保持するため、静的プロパティなどにデータを蓄積するとメモリリークが発生します。max-requests でワーカーをリサイクル
ワーカーが一定数のリクエストを処理したら自動的に再起動させることでメモリリークを軽減できます。デフォルトは 500 リクエストです。最大実行時間の設定
config/octane.php でリクエストの最大実行時間を設定できます。デフォルトは 30 秒です。
並行タスク(Swoole 限定)
Swoole を使用している場合、Octane::concurrently() で複数の処理を並行実行できます。
--task-workers で指定します。
Tick と Interval(Swoole 限定)
Swoole では指定した間隔で定期実行する処理を登録できます。サービスプロバイダのboot メソッドで登録します。
Octane キャッシュ(Swoole 限定)
Swoole の Swoole テーブル を使った超高速インメモリキャッシュです。毎秒最大 200 万回の読み書きが可能です。インターバルキャッシュ
指定した間隔で自動更新されるキャッシュです。Swoole テーブル(Swoole 限定)
全ワーカーからアクセス可能な任意のインメモリテーブルを定義できます。config/octane.php の tables で設定します。
Octane::table() メソッドを使います。
本番環境での運用
Nginx + Octane の構成
本番環境では Nginx の背後で Octane を動かすのが一般的です。Nginx が静的ファイルの配信と SSL 終端を担い、動的リクエストを Octane にプロキシします。Supervisor で常駐させる
本番環境では Supervisor を使って Octane を常時起動しておきます。HTTPS の有効化
Octane 経由で HTTPS リンクを生成するには.env に以下を設定します。
Laravel Cloud との連携
Laravel Cloud では FrankenPHP を使った Octane をフルマネージドでサポートしています。Nginx や Supervisor の設定は不要で、たった 2 ステップで Octane を有効化できます。1
パッケージのインストール
Octane をインストールします。
octane:install コマンドは実行してもかまいませんが必須ではありません。2
Laravel Cloud で Octane を有効化
環境の App コンピュートクラスタの設定を開き、「Use Octane as runtime」 をオンにして保存・デプロイします。Laravel Cloud が自動的に FrankenPHP + Octane でアプリケーションをビルド・起動します。