【Laravel】安易にphp artisan config:cacheはしないほうがいい

タイトル通りです。

もくじ

envを読み込まなくなる

$ php artisan config:cache

制作進行中のLaravelアプリにおいて上記を実行すると、nullを返す、つまりenvの中身がカラになってしまうようです。

私はキャッシュクリアと同様の軽いノリで実行したが最後、1日これに振り回されてしまいました。

実行後、画面上部にエラーがずっと表示されてしまいます。添付は一部で、数えたら30行もの数がエラーとして出ていました。

f:id:bonoponz:20201021184936p:plain

(モザイク部分はローカルのパスが表示されています)

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が返ってくるようになりました。

f:id:bonoponz:20201022151235p:plain

一方でGETだと問題ありません。

419が返ってくる要因は、POST通信の際のCSRFクロスサイトリクエストフォージェリ)対策ができていないことです。

Laravelの独自エラーコードのようですね。

bonoponz.hatenablog.com

対策

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コマンドを実行すべきでしょう。アプリケーションの開発期間中は設定が頻繁に変更されることも多いので、ローカルでの開発中にこのコマンドを実行してはいけません。

参考:設定 7.x Laravel

ぴゃっ😭

実際、解決した4つのコマンドを実行した際、本来あるはずのキャッシュファイル自体が作成されたようでした。なのでもしかしたら、必要なキャッシュファイルが何かしら意図せず消えてしまい、存在しないのでキャッシュクリアなども何もうまくいかなかったのかもしれません。

f:id:bonoponz:20201022152208p:plain

選択している2つのファイルしか実行前には存在しておらず、存在していたファイルも作成日が変わったので作り直されたのかもです。

丸一日このエラーと闘って、キャッシュまわりに少し詳しくなれました。

ポジティブシンキンで完としておきます。

キャッシュ関連

キャッシュ関連ではこの記事もご参考に。

bonoponz.hatenablog.com

本当の解決('21 2月更新)

実はこの現象、envがクリアされるたびにキャッシュを作りなおす必要がありこれがまた面倒でした。

なので、きちんと解決したいと思いずっと諦めずにいたんですが先日ようやく解明しまいた。

そもそもvendorがおかしくなっているのではと踏み、vendorフォルダを作り直すことにしました。

過去の記事でも軽く触れていますが、venderディレクトリを改めて構築するにはcomposerでライブラリをインストールしなおします。

bonoponz.hatenablog.com

$ composer install

これにて見事に.envファイルが壊れる現象がなくなりました。解決まで長かった。。。

めでたしめでたし。

何方かのお役に立てれば幸いです。

参考URL

設定 7.x Laravel

危険!Laravelで「config:cache」を使う時の注意点 – console dot log

Laravel で .env の値が読み込まれない時はキャッシュの存在を疑う - Qiita

Laravel キャッシュクリア系コマンドなど - Qiita

【Laravel】419エラーが出たときの対策