まずはじめに ※読み飛ばし推奨
---大事なことなので二回記述しますが、ここらへんは読み飛ばし推奨です---
laravel5でcomposer updateを起こしたらなんとも言いがたい、難読漢字だらけの文字化けを起こすのである。(私はこれをIT写経と名付けた)
ちなみにこの状態でmacのターミナルにてlaravelのコマンドを適当に打つと文字化けの中に絵文字が現れたりして非常に愉快な状態になる。
で、この状態をどうにも直さないことには開発ができないと困っていたところ、laravelのエキスパートが解決方法を伝授してくださった。
ご本人がドキュメント化しないのか尋ねたところ、株が上がるのであれば君がまとめておけばいいという粋な回答をいただく。
ということで、言われるがまま、株を上げるためにここに記しておくことにする。
---ここまで---
前提
APP_DEBUG = falseにする。
かつ
composer.jsonに以下の記載がある
~
"scripts":{
"post-update-cmd":[
"php artisan clear-compiled",
"php artisan optimize"
]
}
原因
APP_DEBUG = false時にはphp artisan optimizeが実行されるため
[アプリ]/vendor/compiled.phpが生成されることによってこの問題が発生する。
生成されたcompiled.phpには
Symfony\Component\Debug のErrorHandlerクラスで
$e = md5("{$type}/{$line}/{$file}^@{$message}", true);
この処理でnull文字がはいっていて文字化けしている
^@
↑これ
コンパイル前は
$e = md5("{$type}/{$line}/{$file}\x00{$message}", true);
コンパイル時に\x00が解釈できなくて問題が起きている
そういう訳なので文字化けした状態からcompiled.phpを消すとうまいこと表示される。
例えば
1.
rm vendor/compild.php
2.
php artisan clear-compiled
で削除が可能
ただ、composer updateした際に生成されるので、このままでは再度composer updateをしたらまた例のcompiled.phpができあがって、文字化けが起こる ということを繰り返してしまう。
解決するには
1.composer updateをした時にcompiled.phpが生成されないような設定をする必要がある。
更に掘り下げると、compiled.phpはphp artisan optimizeというコマンドを実行した際に生成されるので、php artisan optimizeが起きる場所そのものを削除すれば良い。
ということで、アプリ直下のcomposer.jsonを見てみる。
すると、php artisan optimizeがあったので削除。
これで再度composer updateをしてもcompiled.phpが生成されずに済む、ということになる。
2.APP_DEBUG = trueにする
APP_DEBUG = true時にはoptimizeが実行されないので問題なければAPP_DEBUG = trueにする。