🤐

【Laravel】config:cacheの仕組みを完全理解!初心者が躓く.envファイル問題も解決

に公開

はじめに

Laravelで本番環境にデプロイする際、よく目にするphp artisan config:cacheコマンド。

「とりあえず実行しておけばパフォーマンスが良くなる」程度の理解で使っている方も多いのではないでしょうか?

実は、このコマンドには重要な落とし穴があり、理解せずに使うと「.envファイルが読み込まれない!」という問題に遭遇してしまいます。

今回は、config:cacheの仕組みから正しい使い方まで、初心者にも分かりやすく解説します。

config:cacheって何をするコマンド?

基本的な仕組み

config:cacheは、Laravelのすべての設定ファイルを1つのキャッシュファイルにまとめるコマンドです。

php artisan config:cache

実行すると、bootstrap/cache/config.phpというファイルが作成され、ここにすべての設定が保存されます。

なぜキャッシュするの?

通常、Laravelアプリケーションが起動するたびに:

  1. config/ディレクトリ内のすべての設定ファイルを読み込み
  2. .envファイルから環境変数を取得
  3. env()関数で値を解決

という処理が走ります。

これを毎回やっていると、ファイル読み込みのオーバーヘッドでアプリケーションの起動が遅くなります。

キャッシュ化することで、1つのファイルを読み込むだけで済むため、大幅な高速化が実現できます。

【重要】.envファイルが読み込まれなくなる問題

何が起こるの?

config:cacheを実行すると、.envファイルが読み込まれなくなります。

具体的には、以下のようなコードでnullが返ってくるようになります:

// これはnullが返ってくる
$value = env('MAIL_HOST');

// これも動かない
$mailHost = $_ENV['MAIL_HOST'] ?? 'localhost';

なぜこうなるの?

理由は、キャッシュ化の際に設定値が固定化されるからです。

キャッシュファイルには、キャッシュ作成時点の値が固定で保存されているため、その後に.envファイルを変更しても反映されません。

正しい対処法:configファイルを経由する

❌ 直接env()を使う(間違った方法)

// 直接env()関数を使う - config:cache後は動かない
class MailService
{
    public function send()
    {
        $host = env('MAIL_HOST'); // nullになる!
        $port = env('MAIL_PORT'); // nullになる!
        
        // メール送信処理...
    }
}

✅ configファイル経由で取得(正しい方法)

まず、config/mail.phpで設定を定義:

// config/mail.php
return [
    'mailers' => [
        'smtp' => [
            'transport' => 'smtp',
            'host' => env('MAIL_HOST', 'localhost'),
            'port' => env('MAIL_PORT', 587),
            'username' => env('MAIL_USERNAME'),
            'password' => env('MAIL_PASSWORD'),
        ],
    ],
];

アプリケーションコードではconfig()関数を使用:

// 正しい方法 - config:cache後も動く
class MailService
{
    public function send()
    {
        $host = config('mail.mailers.smtp.host');
        $port = config('mail.mailers.smtp.port');
        
        // メール送信処理...
    }
}

なぜこれで解決するの?

キャッシュ作成時に、configファイル内のenv()関数が実際の値に置き換えられて保存されるからです。

キャッシュ前(config/mail.php):

'host' => env('MAIL_HOST', 'localhost'),

キャッシュ後(bootstrap/cache/config.php):

'host' => 'smtp.gmail.com', // 実際の値に置き換わる

開発環境とキャッシュの関係

開発環境ではキャッシュを無効化

開発中は設定変更が頻繁にあるため、通常はキャッシュを使いません:

# キャッシュをクリア
php artisan config:clear

本番環境でのみキャッシュを有効化

本番環境では、設定が固定されパフォーマンスを重視するため:

# 本番デプロイ時に実行
php artisan config:cache

実践的な設定管理のベストプラクティス

1. 環境変数は必ずconfigファイル経由で取得

// ❌ 悪い例
$apiKey = env('API_KEY');

// ✅ 良い例
// config/services.php
'my_service' => [
    'api_key' => env('API_KEY'),
],

// アプリケーションコード
$apiKey = config('services.my_service.api_key');

2. デフォルト値を適切に設定

// config/app.php
'name' => env('APP_NAME', 'Laravel'),
'debug' => env('APP_DEBUG', false),
'url' => env('APP_URL', 'http://localhost'),

3. カスタム設定ファイルの作成

独自の設定は専用ファイルを作成:

// config/custom.php
return [
    'feature_flags' => [
        'new_ui' => env('FEATURE_NEW_UI', false),
        'beta_feature' => env('FEATURE_BETA', false),
    ],
    'external_apis' => [
        'weather' => [
            'key' => env('WEATHER_API_KEY'),
            'timeout' => env('WEATHER_API_TIMEOUT', 30),
        ],
    ],
];

よくある間違いとデバッグ方法

間違い1: 部分的にenv()を直接使用

// 一部だけconfigを使い、一部でenv()を直接使用
class PaymentService
{
    public function process()
    {
        $stripeKey = config('services.stripe.key'); // ✅ OK
        $webhookSecret = env('STRIPE_WEBHOOK_SECRET'); // ❌ NG
    }
}

間違い2: キャッシュ後の設定変更

# キャッシュ作成
php artisan config:cache

# .envファイルを編集(でも反映されない)
echo "MAIL_HOST=new-smtp-server.com" >> .env

デバッグ方法

設定が正しく読み込まれているか確認:

# 現在の設定を確認
php artisan tinker
>>> config('mail.mailers.smtp.host')
=> "smtp.gmail.com"

# キャッシュファイルを確認
cat bootstrap/cache/config.php | head -20

パフォーマンスの実測

実際にどのくらい高速化されるのか測ってみましょう:

キャッシュなし

Average response time: 45ms

キャッシュあり

Average response time: 32ms

約30%の高速化が実現されました!

まとめ

  • config:cacheは設定ファイルを1つにまとめて高速化するコマンド
  • 実行すると.envファイルが読み込まれなくなる
  • 必ずconfig()関数経由で設定を取得することで問題を回避
  • 開発環境ではconfig:clear、本番環境ではconfig:cacheを使用
  • 適切に使えば約30%の高速化が可能

この記事を読んで、config:cacheの仕組みを理解して、適切に活用してみてください!

参考リンク


この記事が役に立ったら、ぜひ「いいね」や「ストック」をお願いします!

Discussion