Table of Contents
やること
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.php
の watch
を以下のように編集すると意図しないワーカーの再起動がなくなりました。
'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
福岡でWebエンジニアやってます。PHP, クラウド, インフラあたりが好き。