この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:8
ページ更新者:atom
更新日時:2026-06-11 07:12:00

タイトル: .env
SEOタイトル: Laravel .env 設定完全ガイド(DB / APP_KEY / config:cache / 複数環境)

この記事の要点
  • .env はプロジェクトルートにある環境別設定ファイル。Git に含めない
  • 主要キー: APP_KEY / APP_ENV / APP_DEBUG / DB_* / MAIL_* / CACHE_DRIVER / QUEUE_CONNECTION
  • env()config 配列内のみで使う。コードからは config("...") 経由で読む
  • php artisan config:cache をすると env() は空を返すので、必ず config() 経由
  • 複数環境は .env.production / .env.staging + デプロイ時に切替、本番は Secrets Manager を推奨

.env ファイルの位置と役割

Laravel プロジェクトのルート(artisan と同じ階層)に置く環境変数定義ファイルです。アプリケーションが起動するときに vlucas/phpdotenv が読み込み、PHP の $_ENV / getenv() および Laravel の env() ヘルパで参照できるようになります。

プロジェクト構成
my-app/
├─ app/
├─ bootstrap/
├─ config/         ← .env を読んで実際の設定値を組み立てる
├─ database/
├─ public/
├─ resources/
├─ routes/
├─ storage/
├─ vendor/
├─ .env            ← ★ ローカル / 本番ごとに異なる
├─ .env.example    ← Git にコミット、サンプル
├─ artisan
└─ composer.json

必ず .gitignore.env を含めること。クレデンシャル流出を防ぎます。代わりに .env.example を版管理し、必要キーだけ記述しておきます。

典型的な .env 例

APP_NAME=Laravel
APP_ENV=local                       # local / staging / production
APP_KEY=base64:xxxxxxxxxxxxxxxxxx==
APP_DEBUG=true                       # 本番は必ず false
APP_URL=http://localhost
APP_TIMEZONE=Asia/Tokyo
APP_LOCALE=ja

LOG_CHANNEL=stack
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=secret

BROADCAST_DRIVER=log
CACHE_DRIVER=redis
QUEUE_CONNECTION=database
SESSION_DRIVER=redis
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_FROM_ADDRESS=hello@example.com
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=

APP_KEY の生成

APP_KEY はセッション暗号化・Cookie 暗号化・encrypt() ヘルパに使われる秘密鍵です。未生成だと「No application encryption key has been specified.」エラーになります:

# 鍵生成(.env の APP_KEY に自動書き込み)
php artisan key:generate

# 出力例
# Application key set successfully.

# 既にユーザーセッションがある状態で再生成すると、全ユーザーがログアウトする
# 本番では原則 1 回のみ

config() と env() の使い分け

Laravel での鉄則: env() は config 配列内のみで使い、アプリケーションコードからは config() 経由で読みます。

// config/database.php
return [
    'default' => env('DB_CONNECTION', 'mysql'),
    'connections' => [
        'mysql' => [
            'host'     => env('DB_HOST', '127.0.0.1'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
        ],
    ],
];

// アプリケーションコード
$host = config('database.connections.mysql.host');

// ❌ NG: アプリコードで env() を直接呼ぶ
$host = env('DB_HOST');   // config:cache 後に null になる!

config:cache の落とし穴

本番運用では必ず php artisan config:cache を打って設定値を 1 ファイルにキャッシュします。これにより:

  • 毎リクエストの config/ ディレクトリ読み込みが消え、体感数十 ms 改善
  • env().env を読まなくなり null を返す
  • そのため、config() ヘルパ経由でしか値を取得できない
# 本番デプロイの定番
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache

# 設定を変更したい場合は一度クリア
php artisan config:clear
# → .env を編集 → 再キャッシュ
php artisan config:cache

# 全部まとめて
php artisan optimize:clear   # 全クリア
php artisan optimize         # 全キャッシュ

.env の特殊記法

# クォート: 値に空白を含む場合
APP_NAME="My App"

# 既存変数の展開
MAIL_FROM_NAME="${APP_NAME}"
APP_URL="https://${APP_DOMAIN}"

# 真偽値(自動で boolean に)
APP_DEBUG=true
APP_DEBUG=false
APP_DEBUG=(true)      # () で囲むと文字列扱い

# null
DB_PASSWORD=null
DB_PASSWORD=(null)

# 空文字
DB_PASSWORD=

# コメント
# DB_HOST=staging.example.com    ← 行頭 # でコメント
.env の値env() の戻り値
truebool true
(true)string "true"
nullnull
(null)string "null"
emptystring "empty"
(empty)string ""
(値なし)string ""

環境別の使い分け

# Laravel 標準は .env を 1 つだけ読む
# Docker や CI では環境別に切替

# 方法1: 環境変数 APP_ENV で .env ファイルを切替
# bootstrap/app.php や Service Provider で
$app->loadEnvironmentFrom('.env.' . env('APP_ENV', 'local'));

# 方法2: シンボリックリンクで切替
ln -sf .env.production .env

# 方法3: Docker / Kubernetes は実環境変数で上書き
# .env は無くてもよい

環境別ファイル

ファイル用途
.env.example★ コミット。必須キーのテンプレ
.env個人 / サーバごとの実値(コミット禁止)
.env.localローカル開発用
.env.stagingステージング
.env.production本番
.env.testingphp artisan test 実行時に自動読込

Laravel Vapor / Forge での運用

サービス.env の扱い
Laravel Forgeダッシュボードから編集、デプロイ時にサーバへ配置
Laravel Vapor環境別に AWS SSM Parameter Store に保存、ビルド時に .env 生成
AWS ECS / FargateTask Definition の環境変数 or Secrets Manager 参照
Herokuheroku config:set DB_HOST=...
KubernetesSecret マウント or 環境変数注入

Secrets Manager / Vault 連携

// AWS Secrets Manager から取得して config に注入
// config/database.php
return [
    'connections' => [
        'mysql' => [
            'host'     => env('DB_HOST', '127.0.0.1'),
            'password' => env('DB_PASSWORD') ?? aws_secret('db/mysql/password'),
        ],
    ],
];

// app/Helpers/aws.php
function aws_secret(string $name): ?string {
    static $cache = [];
    if (isset($cache[$name])) return $cache[$name];

    $client = new \Aws\SecretsManager\SecretsManagerClient([
        'region' => env('AWS_DEFAULT_REGION', 'ap-northeast-1'),
        'version' => 'latest',
    ]);
    $result = $client->getSecretValue(['SecretId' => $name]);
    return $cache[$name] = $result['SecretString'] ?? null;
}

セキュリティのチェックリスト

  • .gitignore.env を必ず追加
  • APP_DEBUG=false を本番で徹底(true のままだと例外時に環境変数が画面に出る)
  • 本番 APP_ENV=production
  • APP_KEY は環境ごとに別、絶対に共有しない
  • パスワード / API キーは可能なら Secrets Manager / Vault に
  • サーバの .env はパーミッション 640 等で読み取り制限
  • 定期的に APP_KEY をローテーション(ユーザー再ログイン許容できる場合)

よくあるトラブル

症状原因対処
「No application encryption key」APP_KEY 未生成php artisan key:generate
本番でだけ env() が nullconfig:cache 適用済config() 経由で読む
.env を編集しても反映されないconfig キャッシュphp artisan config:clear
値に # を含むと切れるコメント記法と衝突ダブルクォートで囲む
テスト実行時に本番 DB を見てしまった.env.testing 未作成phpunit.xml<env name="DB_*"> 設定

FAQ

Q: .env を Git に上げたらどうする?
A: 即 APP_KEY / DB パスワード / API キーをすべてローテーション。git history から削除(git filter-repo 等)。

Q: コマンドラインから値を確認したい
A: php artisan tinkerconfig('database.connections.mysql.host')、または php artisan env で APP_ENV を確認できます。

Q: .env をクラウドファイルストレージで管理してもいい?
A: Drobox / Google Drive 等の共有は非推奨。Secrets Manager や 1Password / Vault などのシークレット管理ツールを使ってください。