Top View


Author uchida

[Laravel11] WSL2 で Laravel Octane - FrankenPHP を Sail で動かすまで

2024/05/07

やること

Laravel Octane のアプリケーションサーバにFrankenPHPを利用したローカルの環境をドキュメントを見ながら作ってみます。

環境情報

  • WSL2
  • Docker, Docker Compose インストール済み
  • ローカルにPHPなし

参考サイト

ローカルで Laravel Octane の環境構築

1. Laravel Projectの作成

ローカルにPHPがないため、Laravelが提供しているDocker Imageからプロジェクトを作成します。

$ docker run --rm \
    -u "$(id -u):$(id -g)" \
    -v "$(pwd):/var/www/html" \
    -w /var/www/html \
    laravelsail/php83-composer:latest \
    composer create-project laravel/laravel octane-sail

(余談)Laravel11から carete-project すると最後に以下のメッセージが出るようになって驚きました。

> @php -r "file_exists('database/database.sqlite') || touch('database/database.sqlite');"
> @php artisan migrate --graceful --ansi

   INFO  Preparing database.

  Creating migration table ....................................... 6.44ms DONE

   INFO  Running migrations.

  0001_01_01_000000_create_users_table .......................... 20.89ms DONE
  0001_01_01_000001_create_cache_table ........................... 7.17ms DONE
  0001_01_01_000002_create_jobs_table ........................... 17.97ms DONE

SQLiteのファイル作成からDBのマイグレーションまでやってびっくり。 初学者がDBのコンテナ作成周りで困っちゃうことが多いからかな。

2. Sail で Laravel を動かす

laravel/sail は既に初期状態で入っていますが、docker-compose.ymlはないため、以下のコマンドで生成します。

$ cd octane-sail

# docker-compose.ymlの生成
$ docker run --rm \
    -u "$(id -u):$(id -g)" \
    -v "$(pwd):/var/www/html" \
    -w /var/www/html \
    laravelsail/php83-composer:latest \
    php artisan sail:install

# Build, Start
$ ./vendor/bin/sail up -d

# 初期マイグレーションの実行
$ ./vendor/bin/sail artisan migrate

(余談) php artisan sail:install を実行すると .env のDB_CONNECTIONが sqlite から mysql に書き換えられることを今回初めて知りました...。

ここまで終われば、 http://localhost でLaravelのウェルカムページが見えてるはずです。

Sailでは、UbuntuをベースにPHPの実行環境をビルドし、sail up したときに Supervisor のプロセスを起動したうえで、PHPのプロセスをデーモン化しています。

何もいじらない場合、Supervisorでは、php artisan serve が実行され、ビルドインサーバが起動します。

# vendor/laravel/sail/runtimes/8.3/Dockerfile
...
ENV SUPERVISOR_PHP_COMMAND="/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80"
...

3. Laravel Octane - FrankenPHP

アプリケーションサーバをFrankenPHPで動くように変更します。

# Laravel Octane をインストール
$ ./vendor/bin/sail composer require laravel/octane

# FrankenPHPのinstall
$ ./vendor/bin/sail artisan octane:install --server=frankenphp
 FrankenPHP's Octane integration is in beta and should be used with caution in production. Do you wish to continue? (yes/no) [yes]:
 > yes

 Unable to locate FrankenPHP binary. Should Octane download the binary for your operating system? (yes/no) [yes]:
 > yes

 40871924/40871924 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

   INFO  Octane installed successfully.

ここまで終わると、Octaneで設定ファイル config/octane.php が生成され、.env にも OCTANE_SERVER の項目が追加されています。

docker-compose.ymlを書き換え、Supervisorで起動するPHPプロセスを artisan octane:start に更新します。

services:
  laravel.test:
    ... 
    environment:
      ...
      SUPERVISOR_PHP_COMMAND: "/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan octane:start --server=frankenphp --host=0.0.0.0 --admin-port=2019 --port=80" 
      XDG_CONFIG_HOME:  /var/www/html/config 
      XDG_DATA_HOME:  /var/www/html/data 

再起動すると、FrankenPHPで動いているLaravelがhttp://localhost/で確認できます。

$ ./vendor/bin/sail stop
$ ./vendor/bin/sail up -d

4. ファイルの変更をすぐに反映するようにする

Octaneの仕様上、ソースコードを変更してブラウザを更新しても変更が反映がされません。

そのため、コンテナをいちいち再起動しないで済むように --watch オプションがついています。 このオプションがSailでも使えるか試してみます。

$ ./vendor/bin/sail up -d

# ファイル監視用のライブラリを追加
$ ./vendor/bin/sail npm install --save-dev chokidar

docker-compose.yml の編集

services:
  laravel.test:
    ... 
    environment:
      ...
      SUPERVISOR_PHP_COMMAND: "/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan octane:start --server=frankenphp --host=0.0.0.0 --admin-port=2019 --port=80 --watch" 
$ ./vendor/bin/sail up -d

試しに resources/views/welcome.blade.php を編集してみてブラウザを更新してみると即座に反映されます。

ただ、私の環境だけかもしれませんが、Sailをフォアグランドで実行してみると、ファイルの変更していないのにワーカーが繰り返し再起動してしまっているのが分かります。

$ ./vendor/bin/sail up
...
octane-sail-laravel.test-1  |    WARN  server is listening only on the HTTP port, so no automatic HTTPS will be applied to this server
octane-sail-laravel.test-1  |
octane-sail-laravel.test-1  |    INFO  Application change detected. Restarting workers…
octane-sail-laravel.test-1  |
octane-sail-laravel.test-1  |    WARN  server is listening only on the HTTP port, so no automatic HTTPS will be applied to this server
octane-sail-laravel.test-1  |
octane-sail-laravel.test-1  |    INFO  Application change detected. Restarting workers…
...

バックグラウンドで実行させていれば実害はあまりないのですが、気持ちのいい状況ではないので暫定的な対応を調査。

結論として、config/octane.phpwatch を以下のように編集すると意図しないワーカーの再起動がなくなりました。

    'watch' => [
        'app',
        'bootstrap',
        'config/**/*.php', // ← 'config',から変更
        'database/**/*.php',
        'public/**/*.php',
        'resources/**/*.php',
        'routes',
        'composer.lock',
        '.env',
    ],

FrankenPHPの設定ファイル config/caddy/autosave.json が常に変更検知され再起動しているようでした。

なぜこうなるか、までは調べ切れていないのでまた勉強しておきます。

おわり

ドキュメントからFrankenPHPでLaravelをローカルで動かすまでやってみました。

ファイル変更部分の対応が果たしてこれで正解なのか分かってないので、公式Issueなど調べつつ開発を続けてみます。

正攻法っぽいものが分かったらこの記事もアップデートしておきます。

uchida

uchida

福岡でWebエンジニアやってます。PHP, クラウド, インフラあたりが好き。