Laravel

【Laravel】.envとphp artisan config:cacheを正しく理解する

config:cacheについて検索すると、
結構間違った記事が上にあって混乱している人がいたので正しく使えるようになるための記事を書きました。

とりあえず「artisan config:cachを実行するな系の記事Laravelを理解していない人の記事なので見たことを全て忘れてください。
しちゃだめなものがずっと機能として提供されているわけはないですよね。

artisan config:cacheは何をしているのか?

.envや、configディレクトリ以下の設定などを一つのキャッシュファイルにまとめ、これにより処理を高速化します。
このキャッシュファイルを使うことで高速化しているので、キャッシュファイルがあれば元の.envは読み込まなくなります。

artisan config:cacheは実際どう実行したらよいか

先に簡単なまとめです。プロジェクトの状況に合わせて最適化してください。

local開発環境(自分のPC)では実行しない
local以外(サーバー上)の開発環境では実行する
本番サーバーでは実行する

※サーバーへデプロイするときに自動でartisan config:cacheを実行するように設定するのがベスト

実行しないのはlocalのみです。他では開発環境も含め実行する方がよいでしょう。

なぜ?

cacheすると.envの変更などが再度コマンドを実行しないと反映されません。
local環境でcacheしてしまうと高速化のメリットより手間が増えるデメリットの方が大きいため基本的にlocal環境ではcacheしません。
公式のドキュメントにも"localでは"実行すべきでないと記載があります。

本番サーバーではcacheします。
artisan config:cacheが本番サーバーでの処理を高速化するためにある機能なのでこれはそのままですね。

local以外、サーバー上にある開発環境でも基本的にはcacheしましょう。
「キャッシュしてないと動いていたけど、本番サーバーでキャッシュしたらエラーがでた!」ということを防ぐためです。
テストサーバーと本番サーバーの状態はできるだけ合わせ、cacheしても正常に動くことを確認しておきましょう。

サーバーへのデプロイ(反映)方法にもよるのですが、
デプロイ時に自動でサーバー上でphp artisan config:cacheが実行されるようにし
自分では直接コマンドを叩く必要がないようにするのがベストです。
実行漏れは不具合発生の可能性があるのと、手間の削減ですね。

さて、以上の理由がわかっていればその他臨機応変に、例えば

どうしてもartisan config:cacheを実行するとエラーになるなら本番サーバーでも実行しないで進めるのは有りです。
大きいプロジェクトだとパフォーマンスの影響がコストなど色々なところに出てきますが、
小さいプロジェクトであればそこにこだわりすぎるよりは早くリリースしてしまえる方がメリットが多いでしょう。
ただし、実行せずに進めていて途中で実行するようにするのはなかなか骨が折れるのでその点は注意です。

また、local開発環境と本番サーバーしかないような場合、
localでちゃんとartisan config:cacheを実行して動作することを確認しながら本番でも実行するのも有りです。
この場合、設定を変更したときに忘れずにartisan config:cacheを実行するようにしましょう。
また、localでconfig:cacheした設定ファイルをそのまま本番では使えません。
本番サーバーでのconfig:cacheは絶対に忘れずに行いましょう。

cacheファイルはどこにあるか

bootstrap/cache/config.php にあるのがキャッシュファイルです。
もしphp artisan cache:clearでエラーが出る場合などはこちらのファイルを直接削除すると解消します。
他のrouteなどのキャッシュもbootstrap/cache/以下にファイルが作成されます。

環境変数の設定方法

自分で環境変数を設定する場合の方法です。

まず変数の内容を.envに記載しましょう。

EXAMPLE_VALUE=value

configディレクトリ配下にファイルを作成します。
ファイル名や変数名は適宜変えてください。

return [
    'abc' => env('EXAMPLE_VALUE', 'default_value'),
    'de_f' => [
        'ghi' =>env('ENV_KEY_GHI', 'default_value2'),
    ]
];

設定した値を使うのは下記の様に使います。
example.php に記載したabcの値を使う場合は

config('example.abc');

example.php に記載した['de_f']['ghi']の値を使う場合は

config('example.de_f.ghi');

となります。

env('ENV_KEY', 'default_value'), といったenv関数はconfigディレクトリ配下にのみ記載します。
そうしないとコンフィグのキャッシュしたときに読み込めなくなります。
前述のキャッシュの仕組みからすると当然ですね。
これをわかっておらずartisan config:cacheをしないという人や記事が多いです。

最後に

いかがだったでしょうか。
わかっていないと怖いartisan config:cacheですが、ちゃんと使うと簡単に高速化できます。
私は測定はしていないのですが、各種キャッシュにより10~30%程度の高速化がされるといった記事もありました。

-Laravel