🦊

FrankenPHPが遅いと感じたときに見直すポイント3選

に公開

こんにちは、booostのバックエンドエンジニアのma_meです。
FrankenPHPを触っているときにパフォーマンスが出ずにハマったポイントがあったので、共有します。

概要

FrankenPHPには次の2つのモードが存在します。

  1. Classicモード
  2. Workerモード

Workerモードでこそ高パフォーマンスを発揮しますが、
うっかり設定が漏れてClassicモードになると、従来のWebサーバーと同等かそれ以下の性能しか発揮されません。
この記事では、Workerモード設定時に漏れがちなポイント3点を解説します。

前提環境情報

  • Laravel 10.x以降
  • PHP 8.2以降

注意が必要な3つのポイント

  1. Laravel Octaneを導入していない
  2. Workerスクリプトを設定していない
  3. 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モードで起動していれば、高パフォーマンスが出せるはずです。

Booost

Discussion