config:cache 後に .env が反映されないときの対処法
.env(ドットエンブ)ファイルを書き換えたのに、アプリの動きがまったく変わらない。あるいは、今まで動いていたのに急に設定が読めなくなった。
こんなときの原因でとても多いのが、設定のキャッシュです。この記事では、なぜ起きるのかと、その直し方を解説します。
結論(急いでいる人向け)
ターミナル(黒い画面)でプロジェクトのフォルダに移動し、次を実行します。
php artisan config:clear
これで設定のキャッシュが消え、.env の変更が再び反映されます。
ただし「なぜこうなるのか」を知らないと、本番環境で同じ問題を繰り返します。以下で仕組みを説明します。
.env とは何か
.env は、プロジェクトの直下にある設定ファイルです。データベースのパスワードなど、環境ごとに違う値や人に見せたくない値をここに書きます。
APP_NAME=Laravel
DB_DATABASE=laravel
DB_PASSWORD=secret
「環境」とは、たとえば「自分のパソコン(開発環境)」と「公開しているサーバー(本番環境)」のことです。パスワードは環境ごとに違うので、コードとは別のファイルに分けておく、という考え方です。
config:cache とは何をするコマンドか
Laravel には config/ フォルダがあり、その中の設定ファイルが .env の値を読み込んでいます。たとえば config/app.php にはこう書かれています。
'name' => env('APP_NAME', 'Laravel'),
env('APP_NAME', 'Laravel') は「.env の APP_NAME を読む。なければ 'Laravel' を使う」という意味です。
アプリを動かすたびに、Laravel は .env と config/ の中身をすべて読み込みます。これは少し時間がかかります。そこで、あらかじめ1つのファイルにまとめておいて速くするのが config:cache です。
php artisan config:cache
実行すると、次のように表示されます。
INFO Configuration cached successfully.
これで設定の読み込みが速くなります。本番環境では実行するのが定番です。
なぜ .env が反映されなくなるのか
ここが肝心なところです。
config:cache を実行すると、Laravel は「まとめて作ったキャッシュファイル」だけを見るようになり、.env ファイルをもう読まなくなります。
そのため、こうなります。
.envを書き換えても、キャッシュには反映されない(古い値が使われ続ける)- コードの中の
env('APP_NAME')は、null(何もない状態)になる
実際に試すと、こうなります。
【config:cache する前】
env('APP_NAME') → 'Laravel'
config('app.name') → 'Laravel'
【config:cache した後】
env('APP_NAME') → NULL ← 読めなくなる
config('app.name') → 'Laravel' ← こちらは読める
config() の方は読めていることに注目してください。キャッシュされた時点の値がちゃんと入っているからです。
直し方は2つ
方法1: キャッシュを消す(開発中はこれ)
自分のパソコンで開発している間は、キャッシュは不要です。消してしまいましょう。
php artisan config:clear
これで .env を再び読むようになり、書き換えた内容が反映されます。開発中は config:cache を使わないのが基本です。
方法2: キャッシュを作り直す(本番環境ではこれ)
本番環境では速さのためにキャッシュを使いたいので、消すのではなく作り直します。
php artisan config:cache
.env を書き換えたら、そのたびにこのコマンドを実行してキャッシュを更新します。「.env を編集したら config:cache をやり直す」とセットで覚えてください。
いちばん大事な予防策: env() をコードの中で使わない
キャッシュしても壊れないようにするコツがあります。それは、env() を config/ の中だけで使うことです。
コントローラやビュー(画面を作るファイル)など、config/ の外では config() を使います。
// ❌ 悪い例: config/ の外で env() を使う
// → config:cache すると null になる
$appName = env('APP_NAME');
// ✅ 良い例: config() を使う
// → キャッシュされていても正しく読める
$appName = config('app.name');
もし独自の設定を追加したい場合は、config/ にファイルを作り、そこで env() を使います。
// config/services.php などに書く
return [
'api_key' => env('MY_API_KEY'),
];
そして使うときは config() 経由で呼びます。
$apiKey = config('services.api_key');
こうしておけば、config:cache を実行しても問題は起きません。これは Laravel 公式も推奨している書き方です。
関連するキャッシュのコマンド
設定以外にもキャッシュはあります。「何かおかしい」というときにまとめて消せるコマンドを覚えておくと便利です。
| コマンド | 何をするか |
|---|---|
php artisan config:clear | 設定のキャッシュだけを消す |
php artisan config:cache | 設定のキャッシュを作る(作り直す) |
php artisan optimize:clear | 設定・ルート・ビューなどまとめて全部消す |
php artisan optimize | まとめてキャッシュを作る(本番向け) |
原因が設定なのか分からないときは、php artisan optimize:clear でまとめて消すのが手っ取り早いです。
まとめ
.envの変更が反映されないときは、まずphp artisan config:clearを実行する。config:cacheを実行すると、Laravel は.envを読まなくなる。だから反映されなくなる。- そのとき
env()はnullになるが、config()はキャッシュされた値を返す。 - 開発中はキャッシュしない。本番では
.envを編集したらconfig:cacheをやり直す。 - 予防策として、
config/の外ではenv()を使わずconfig()を使う。 - 原因不明のときは
php artisan optimize:clearでまとめて消す。
.env とデータベース設定の関係については、カリキュラムの データベースに接続する でも解説しています。