タイトル通りです。
もくじ
envを読み込まなくなる
$ php artisan config:cache
制作進行中のLaravelアプリにおいて上記を実行すると、nullを返す、つまりenvの中身がカラになってしまうようです。
私はキャッシュクリアと同様の軽いノリで実行したが最後、1日これに振り回されてしまいました。
実行後、画面上部にエラーがずっと表示されてしまいます。添付は一部で、数えたら30行もの数がエラーとして出ていました。
(モザイク部分はローカルのパスが表示されています)
Notice: Undefined index: APP_NAME in パス on line 11 Notice: Undefined index: RETRY_COUNT in パス on line 19 Notice: Undefined index: RETRY_FACTOR in パス on line 20 Notice: Undefined index: RETRY_MIN_TIMEOUT in パス on line 21 Notice: Undefined index: RETRY_MAX_TIMEOUT in パス on line 22 Notice: Undefined index: APP_NAME in パス on line 35 Notice: Undefined index: APP_ENV in パス on line 48
早い話がenvを読み取れていないようですが、なんせカラになってるんだから読み取れませんよね。ただ、実際のenvファイルはしっかり存在していて中身も空になっているわけではありません。
config:cache
を使ってしまうと、.env
にアクセスできなくなるなんてなんて危険なコマンド…。
しかも、いくつか検索してでてきた/bootstrap/cache/config.php
を削除すればいいという解決策。
$ rm -f bootstrap/cache/config.php
そもそもこのファイルがないから解決できない!
419が返ってくる
原因
もうひとつ問題が発生していて、POSTを投げると419が返ってくるようになりました。
一方でGETだと問題ありません。
419が返ってくる要因は、POST通信の際のCSRF(クロスサイトリクエストフォージェリ)対策ができていないことです。
Laravelの独自エラーコードのようですね。
対策
CSRF(クロスサイトリクエストフォージェリ)対策をしてあげるだけです。
<form method="POST" action="/"> @csrf // ★これ 〜処理〜 </form>
しかーし!!!
この対策はすでにしてあったのです。なのになんでエラー出しとんねん!って話です。
ここからは完全に推測ですが、envにはDB情報も繋いでいてPOSTするとDBに接続するわけですが、そのDBに繋げないので「とりあえずエラー吐いとこか、よっしゃ419でええわ」みたいなかんじかなーと(笑)笑えんけど。
なので他の手立てを探しました。そして次で解決。
解決
$ composer dump-autoload $ php artisan clear-compiled $ php artisan optimize $ php artisan config:cache
結局config:cache
やってるやん!ってかんじですが、オートローディングしなおし、オプティマイズ(最適化)も実行して、まるまるっとキャッシュを作り直したい場合に、この一連のコマンドを実行するようです。
これで今回は解決しましたが、なかなかconfig:cache
はえぐいコマンドぽいです。
Laravel公式ドキュメントにも、以下のように記載がされていました。抜粋します。
一般的には、本番環境へのデプロイ作業の一環として、php artisan config:cacheコマンドを実行すべきでしょう。アプリケーションの開発期間中は設定が頻繁に変更されることも多いので、ローカルでの開発中にこのコマンドを実行してはいけません。
ぴゃっ😭
実際、解決した4つのコマンドを実行した際、本来あるはずのキャッシュファイル自体が作成されたようでした。なのでもしかしたら、必要なキャッシュファイルが何かしら意図せず消えてしまい、存在しないのでキャッシュクリアなども何もうまくいかなかったのかもしれません。
選択している2つのファイルしか実行前には存在しておらず、存在していたファイルも作成日が変わったので作り直されたのかもです。
丸一日このエラーと闘って、キャッシュまわりに少し詳しくなれました。
ポジティブシンキンで完としておきます。
キャッシュ関連
キャッシュ関連ではこの記事もご参考に。
本当の解決('21 2月更新)
実はこの現象、envがクリアされるたびにキャッシュを作りなおす必要がありこれがまた面倒でした。
なので、きちんと解決したいと思いずっと諦めずにいたんですが先日ようやく解明しまいた。
そもそもvendorがおかしくなっているのではと踏み、vendor
フォルダを作り直すことにしました。
過去の記事でも軽く触れていますが、venderディレクトリを改めて構築するにはcomposer
でライブラリをインストールしなおします。
$ composer install
これにて見事に.env
ファイルが壊れる現象がなくなりました。解決まで長かった。。。
めでたしめでたし。
何方かのお役に立てれば幸いです。
参考URL
危険!Laravelで「config:cache」を使う時の注意点 – console dot log
Laravel で .env の値が読み込まれない時はキャッシュの存在を疑う - Qiita