W

config:cache 後に .env が反映されないときの対処法

#Laravel #設定 #キャッシュ #artisan #トラブルシューティング

.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') は「.envAPP_NAME を読む。なければ 'Laravel' を使う」という意味です。

アプリを動かすたびに、Laravel は .envconfig/ の中身をすべて読み込みます。これは少し時間がかかります。そこで、あらかじめ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 とデータベース設定の関係については、カリキュラムの データベースに接続する でも解説しています。