🦊
FrankenPHPが遅いと感じたときに見直すポイント3選
こんにちは、booostのバックエンドエンジニアのma_meです。
FrankenPHPを触っているときにパフォーマンスが出ずにハマったポイントがあったので、共有します。
概要
FrankenPHPには次の2つのモードが存在します。
- Classicモード
- Workerモード
Workerモードでこそ高パフォーマンスを発揮しますが、
うっかり設定が漏れてClassicモードになると、従来のWebサーバーと同等かそれ以下の性能しか発揮されません。
この記事では、Workerモード設定時に漏れがちなポイント3点を解説します。
前提環境情報
- Laravel 10.x以降
- PHP 8.2以降
注意が必要な3つのポイント
- Laravel Octaneを導入していない
- Workerスクリプトを設定していない
- Octaneから起動していない
1. Laravel Octaneを導入していない
マルチスレッドで動作するFrankenPHPは、通常のLaravelで動かしても十分に性能を発揮できません。
Laravelをマルチスレッド用に拡張するOctaneライブラリを導入しましょう。
導入方法
導入は簡単で、下記コマンドを実行するだけです。
# Octaneのインストール
composer require laravel/octane
# 実行環境をFrankenPHPに設定
php artisan octane:install --server=frankenphp
2. Workerスクリプトを設定していない
Laravel Octaneをインストール後、環境変数でWorkerスクリプトのパスを指定する必要があります。
この環境変数を定義しないとWorkerモードで起動しません。
.envで設定する場合
FRANKENPHP_CONFIG="worker public/index.php"
Dockerfileの場合
ENV FRANKENPHP_CONFIG="worker public/index.php"
3. artisan octane:start から起動していない
Caddyから直接FrankenPHPを実行するとWorkerスクリプトが迂回され、Classicモードで起動してしまいます。
必ずphp artisan octane:startで起動しましょう。
ダメな例
CMD ["frankenphp", "run", "--config", "/etc/caddy/Caddyfile"]
正しい例
CMD ["php", "artisan", "octane:start", "--port=80", "--admin-port=2019", "--workers=4"]
まとめ
もし現在FrankenPHPを使用していて期待したパフォーマンスが出ていない場合は、まずはこの3点を確認してみてください。
正しくWorkerモードで起動していれば、高パフォーマンスが出せるはずです。
Discussion