はじめに
先日、Laravel13 + PHP8.4環境でBlade表示時に500エラーが発生し、最終的にLaravel12 + PHP8.3環境へ作り直した。
しかし後から振り返ると、
「本当にLaravel13とPHP8.4の組み合わせが原因だったのか?」
という疑問が出てきた。
結論から言うと、犯人は私が幾度となく遭遇してきた権限問題だった可能性が高い。
発生していたエラー
エラー内容は以下。
ErrorException
tempnam(): file created in the system's temporary directory
スタックトレースには、
Filesystem.php
BladeCompiler.php
CompilerEngine.php
View.php
が含まれていた。
Blade描画時のみ発生し、
return 'Laravel OK';
なら正常表示された。
当時の判断
当時は以下を確認した。
php artisan about
php artisan migrate
php artisan route:list
すべて正常。
さらに、
php -r "echo sys_get_temp_dir();"
結果
/tmp
php -r "var_dump(is_writable('/tmp'));"
結果
bool(true)
「Laravel13の不具合かもしれない」と考えた理由
さらに途中で、
Your Composer dependencies require a PHP version ">= 8.4.1".
You are running 8.3.31.
というPHPバージョン関連のエラーにも遭遇した。
そのため、
- Laravel13
- PHP8.4
- Docker
の組み合わせ周辺を疑った。
でも待てよ?
ここで思い出した。
実は私は過去にも、Laravelで何度も似たようなエラーを経験している。
原因は、「所有権(owner)」のズレだった。
過去に発生したエラー
フリマアプリ開発中、以下のエラーが発生した。
Please provide a valid cache path.
The stream or file could not be opened
Failed to open stream: Permission denied
原因は、
storage
bootstrap/cache
の所有者が、
******(私のuser名)
になっており、Laravelを実行している
www-data
が書き込めなくなっていたことだった。
解決した方法
当時は以下で解決した。
docker compose exec php chown -R www-data:www-data /var/www/storage
docker compose exec php chown -R www-data:www-data /var/www/bootstrap/cache
さらに、
docker compose exec php chmod -R 775 /var/www/storage
docker compose exec php chmod -R 775 /var/www/bootstrap/cache
を実行。
その後、
docker compose exec php php artisan optimize:clear
で正常動作した。
今回も同じだった可能性
今回の500エラーは、
BladeCompiler
Filesystem
周辺で発生していた。
つまり、Bladeコンパイル結果を書き込む
storage/framework/views
付近の問題だった可能性がある。
さらに現在のテンプレート環境では、DockerのUID/GIDを合わせる設定を導入している。
その結果、過去に頻発していた権限エラーは発生していない。
結論
Laravel13 + PHP8.4が原因だった証拠は見つかっていない。
むしろ、これまで何度も遭遇してきた「所有権ズレによる権限問題」だった可能性の方が高そうだ。
とはいえ、当時はまだ開発開始前。
コードもデータも存在しなかったため、作り直しを選択した判断自体は間違っていなかったと思う。
学んだこと
エラーが発生したとき、新しい技術やバージョンを疑いたくなる。
でも実際は、「前にも踏んだことがある地雷」だったりする。
次に同じ症状が出たら、LaravelやPHPのバージョンを疑う前に、まず所有者と権限を確認しようと思う。