Laravel Stack traceでオリジナルファイルじゃなくコンパイル済みファイルが表示される

Web開発

Why does not stack trance display a complied file but original file?

Laravel 8.83.5またはLaravel 9へアップグレードすると、エラー発生時のStack Traceの表示がstorage/framework/views内のコンパイルされたファイルになってしまいます。

例えばですが、0a1b72e021d542c2af325a856fadd63c83a4757b.phpといったコンパイル済み
のphpが表示されるんです。

私の開発環境はWindows OSのローカルPCなのですが、Laravel 8の最新バージョン(少なくとも8.83.5)やLaravel 9で発生します。

問題発生前のバージョンはLaravel 8.61.0)

問題発生時のバージョンはLaravel 8.83.5 またはLaravel 9

原因や解決策はわからないですが、回避策を見つけたので共有します。

スポンサー

Larave 8.61とLaravel 8.83.5/Laravel 9でのStack traceの違い

Laravel 8.61のStack trace(望ましい表示)

この例では、resources/views/livewire/recordsにある、records-list.blade.phpというファイルの5行目がエラーになっていることが分かります。

つまり、オリジナルのファイル上のどこでエラーが発生したかわかるようになっています。

Laravel 8.83.5のStack trace(望ましくない表示)

ところが、Laravel 8.83.5の表示は下記になります。

オリジナルのファイルではなく、コンパイルされたeacd1ed14f76c4590599cc7aec3ffba06289dca4.phpというファイルのどこでエラーが発生したかを表示しています。

Larave 9でも同じです。

これでは、具体的にどのファイルでエラーが発生しているか分からず、デバッグの効率が下がってしまいます。

原因と解決策はわかっていません。

私の開発環境だと思います。メインでの開発環境として、Windows 10のPC上にcomposer, node.js, XAMPP, MySQLをインストールした環境を使っています。

回避策

結論: Laravel 9にアップグレードしてDockerを使う。

開発環境として使っているWindows PC上に、WSL2でDocker環境を構築するとうまく表示されました。

この時、Laravel 9にアップグレードしました。Laravel 8.83.5ではDocker上でも同じ問題が発生しました。

Laravelのバージョンを9.5.1にして、同じソースを使ってそれぞれの環境での表示結果を比較します。

ローカル環境 (XAMPPを使用)での表示

 問題発生! コンパイルされたphpファイルが表示される。

※phpのバージョンを8.0.17にしても同じ問題が発生ました。

Dockerの環境 (WSL 2を使用)での表示

問題なくオリジナルファイルが表示される。

※Docker環境では、オリジナルのファイルが使用されています。

結論

原因と対策方法が明らかになるまでは、コンパイルされたファイルで何とかデバッグする。

どうしてもエラーの原因が分からない場合は、Docker環境に切り替えてデバッグする。

以上です。