【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アプリケーションが起動するたびに:
-
config/ディレクトリ内のすべての設定ファイルを読み込み -
.envファイルから環境変数を取得 -
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