env.phpと.envの違いとは?Laravel開発での正しい使い分け3ステップ

「Laravelで.envファイルを編集したのに設定が反映されない…」「env.phpって何?いつ使うの?」そんな疑問を抱いたことはありませんか?

Laravel開発では、環境変数を管理するために.envenv.phpという2つのファイルが登場します。初心者の方は「なぜ2つもあるの?」「どちらを使えばいいの?」と混乱しがちです。実際、この2つの違いを理解していないと、設定変更が反映されなかったり、本番環境でパフォーマンス問題が発生したりします。

この記事では、env.phpと.envの違いを明確に解説し、開発環境と本番環境での正しい使い分けを3ステップで理解できるようにします。セキュリティのベストプラクティスも含めて、実践的に説明します。

目次

env.phpと.envの違いとは?Laravel開発での使い分け

まず、2つのファイルの基本的な役割を理解しましょう。

.envenv.phpは、どちらも環境変数(環境に応じた設定値)を管理するためのファイルですが、目的と使用タイミングが異なります。

.envファイル:人間が編集する設定ファイル

.envファイルは、開発者が直接編集するテキストファイルです。データベース接続情報、APIキー、アプリケーションの設定などを記述します。

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:xxxxxxxxxxxx
APP_DEBUG=true
APP_URL=http://localhost

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

特徴:

  • 人間が読みやすいキー=バリュー形式
  • プロジェクトルートに配置(.gitignoreで除外すべき)
  • 開発中に頻繁に編集する

env.phpファイル:Laravelが生成するキャッシュファイル

env.phpファイルは、Laravelが自動生成するPHP配列形式のキャッシュファイルです。.envの内容をPHPの配列に変換し、高速に読み込めるようにします。

<?php

return array (
  'APP_NAME' => 'Laravel',
  'APP_ENV' => 'local',
  'APP_KEY' => 'base64:xxxxxxxxxxxx',
  'APP_DEBUG' => 'true',
  'APP_URL' => 'http://localhost',
  'DB_CONNECTION' => 'mysql',
  'DB_HOST' => '127.0.0.1',
  // ...
);

特徴:

  • PHPの配列形式でコンパイル済み
  • bootstrap/cache/ディレクトリに生成される
  • .envファイルのパース処理が不要なため高速

なぜ2種類存在するのか?

答えはパフォーマンス最適化です。

開発環境では、.envファイルを直接読み込んでも問題ありませんが、本番環境では毎回.envファイルをパースするのは非効率です。そこで、本番環境では.envの内容をenv.phpにキャッシュし、高速に環境変数を読み込みます。

.envファイル:開発環境での設定管理

開発環境では、基本的に.envファイルのみを使用します。ここでは、.envファイルの使い方を詳しく見ていきましょう。

.envの特徴と役割

.envファイルは、環境ごとに異なる設定を記述するためのファイルです。例えば、ローカル開発環境と本番環境では、データベースのホスト名やAPIキーが異なります。

主な設定項目:

  • アプリケーション設定: APP_NAME, APP_ENV, APP_DEBUG
  • データベース設定: DB_CONNECTION, DB_HOST, DB_DATABASE
  • キャッシュ・セッション: CACHE_DRIVER, SESSION_DRIVER
  • 外部API設定: STRIPE_KEY, AWS_ACCESS_KEY_ID

.envファイルの基本的な書き方

.envファイルは、シンプルなキー=バリュー形式で記述します。

# アプリケーション基本設定
APP_NAME="My Laravel App"
APP_ENV=local
APP_DEBUG=true

# データベース設定
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=my_database
DB_USERNAME=root
DB_PASSWORD="my_secure_password"

# スペースを含む値はダブルクォートで囲む
MAIL_FROM_NAME="Laravel Application"

記述ルール:

  • コメントは#で始める
  • スペースを含む値はダブルクォート"で囲む
  • 値に特殊文字が含まれる場合もダブルクォートで囲む

Gitで管理すべきでない理由

.envファイルには、データベースパスワードやAPIキーなどの機密情報が含まれます。これをGitリポジトリにコミットすると、以下のリスクがあります:

  • GitHubなど公開リポジトリに機密情報が漏洩
  • チームメンバー全員が同じ設定を使ってしまう(環境ごとに異なるべき)
  • 過去のコミット履歴から削除するのが困難

そのため、.envファイルは必ず.gitignoreに追加します。

# .gitignore
.env
.env.backup
.env.production

代わりに、.env.exampleファイルをGitで管理し、必要な設定項目のテンプレートをチームで共有します。

# .env.example
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=

新しいメンバーは、.env.exampleをコピーして.envを作成し、自分の環境に合わせて値を設定します。

# 新規プロジェクトセットアップ時
cp .env.example .env
php artisan key:generate

env.phpファイル:本番環境での高速化

本番環境では、Laravelの設定キャッシュ機能を使用してenv.phpを生成します。これにより、環境変数の読み込みが劇的に高速化されます。

env.phpの特徴と役割

env.phpは、.envファイルの内容をPHP配列に変換したキャッシュファイルです。

生成されるタイミング:

  • php artisan config:cacheコマンドを実行したとき
  • 本番環境へのデプロイ時(CI/CDパイプライン内で実行)

配置場所:

bootstrap/cache/env.php

キャッシュ化による高速化の仕組み

.envファイルを毎回パースするのは、意外と処理コストがかかります。

パフォーマンス比較:

  • .env直接読み込み: 毎リクエストでファイルを読み込み・パース(約5~10ms)
  • env.phpキャッシュ使用: PHP配列をincludeするだけ(約0.5~1ms)

大規模アプリケーションでは、この差が積み重なり、レスポンス速度に影響します。

いつenv.phpが生成されるか

env.phpは、以下のコマンドで生成されます:

# 設定キャッシュを生成(env.phpが作成される)
php artisan config:cache

このコマンドを実行すると、以下の処理が行われます:

  1. .envファイルを読み込む
  2. config/ディレクトリのすべての設定ファイルを評価
  3. 結果をbootstrap/cache/config.phpにキャッシュ
  4. 同時にbootstrap/cache/env.phpも生成

重要: env.phpが存在する場合、.envファイルは読み込まれません。これが初心者の混乱の原因です。

【重要】使い分けの基本ルール

ここが最も重要なポイントです。環境ごとに適切な使い分けをしましょう。

開発環境では.envのみ使用

ローカル開発環境では、キャッシュを使用せず、常に.envファイルを直接読み込むのが基本です。

# 開発環境で設定キャッシュをクリア(env.phpを削除)
php artisan config:clear

理由:

  • 設定変更が即座に反映される
  • デバッグしやすい
  • キャッシュの存在を気にする必要がない

開発中に頻繁に設定を変更する場合、毎回config:cacheを実行するのは面倒です。そのため、開発環境ではenv.phpを生成しないのが一般的です。

本番環境ではenv.phpにキャッシュ

本番環境では、必ずキャッシュを使用します。

# 本番環境デプロイ時
php artisan config:cache
php artisan route:cache
php artisan view:cache

デプロイスクリプト例:

#!/bin/bash

# Gitから最新コードを取得
git pull origin main

# Composerで依存関係をインストール
composer install --no-dev --optimize-autoloader

# キャッシュを再生成
php artisan config:cache
php artisan route:cache
php artisan view:cache

# マイグレーション実行(必要に応じて)
php artisan migrate --force

# アプリケーションを再起動
php artisan queue:restart

環境変数変更時の注意点

最も重要な注意点:

env.phpが存在する状態で.envファイルを編集しても、変更は反映されません

# ❌ 間違った手順
# 1. .envファイルを編集
vi .env

# 2. アプリケーションを再起動
# → 変更が反映されない!(env.phpが優先されるため)

# ✅ 正しい手順
# 1. .envファイルを編集
vi .env

# 2. キャッシュを再生成
php artisan config:cache

# これで変更が反映される

本番環境で設定を変更する際は、必ずキャッシュの再生成を忘れないでください。

よくあるトラブルと解決法

実際の開発現場でよく遭遇するトラブルと、その解決法を紹介します。

トラブル1: .envを変更したのに反映されない

症状: .envファイルでデータベースのパスワードを変更したのに、「Access denied」エラーが出続ける。

原因: env.phpが残っており、古いキャッシュが使用されている。

解決法:

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

# または、キャッシュを再生成
php artisan config:cache

開発環境では、基本的にconfig:clearでキャッシュを削除するだけで十分です。

トラブル2: env.phpが残っていて設定が更新されない

症状: Gitで最新のコードをpullしたが、新しい環境変数が反映されない。

原因: bootstrap/cache/env.phpが古いまま残っている。

解決法:

# キャッシュファイルを手動で削除
rm bootstrap/cache/env.php
rm bootstrap/cache/config.php

# または、Artisanコマンドでクリア
php artisan config:clear
php artisan cache:clear

チーム開発では、.gitignoreに以下を追加して、キャッシュファイルをGitで管理しないようにしましょう。

# .gitignore
/bootstrap/cache/*.php
!/bootstrap/cache/.gitignore

トラブル3: 本番環境で.envを直接編集してしまった場合

症状: 本番環境で.envファイルを編集したが、変更が反映されない。

原因: 本番環境ではenv.phpが使用されているため、.envの変更は無視される。

解決法:

# 本番環境で設定変更後、必ずキャッシュを再生成
php artisan config:cache

# アプリケーションを再起動(Supervisor、Queue Workerなどを使用している場合)
php artisan queue:restart
sudo supervisorctl restart laravel-worker:*

重要: 本番環境で設定を変更する場合は、必ず以下の手順を踏みましょう:

  1. .envファイルを編集
  2. php artisan config:cacheを実行
  3. 関連サービスを再起動

セキュリティのベストプラクティス

環境変数には機密情報が含まれるため、適切なセキュリティ対策が必要です。

.envファイルの保護方法

1. Gitから除外する

前述の通り、.envファイルは必ず.gitignoreに追加します。

# .gitignore
.env
.env.backup
.env.production
.env.staging

2. ファイルパーミッションを適切に設定

サーバー上の.envファイルは、Webサーバーのユーザーのみが読み取れるように設定します。

# .envファイルのパーミッションを制限
chmod 600 .env
chown www-data:www-data .env  # Webサーバーユーザーに所有権を設定

3. Webから直接アクセスできないようにする

Laravelのデフォルト設定では、.envファイルはプロジェクトルートに配置され、public/ディレクトリの外にあるため、Webから直接アクセスできません。

ただし、念のため.htaccessや Nginx設定で明示的に拒否することも推奨されます。

Apache (.htaccess):

<Files .env>
    Require all denied
</Files>

Nginx:

location ~ /\.env {
    deny all;
    return 404;
}

機密情報の管理

推奨される管理方法:

  1. 環境変数管理サービスを使用: AWS Secrets Manager、Doppler、Vaultなど
  2. 本番環境の.envは手動配置: デプロイツールに含めず、サーバー上で直接管理
  3. 暗号化されたシークレット管理: Laravel Envoyer、Laravel Forgeなどのデプロイツールを使用

環境変数の暗号化

Laravel 9以降では、環境変数の暗号化機能が追加されています。

# .envファイルを暗号化
php artisan env:encrypt

# 暗号化されたファイル(.env.encrypted)が生成される
# これをGitで管理できる

# 復号化
php artisan env:decrypt

暗号化キーは、別の安全な場所(パスワードマネージャーなど)に保管します。

チーム開発での運用方法

チーム全体で環境変数を適切に管理するためのベストプラクティスを紹介します。

.env.exampleの活用

.env.exampleファイルは、プロジェクトで必要な環境変数のテンプレートです。実際の値は含めず、キー名と説明のみを記述します。

# .env.example

# アプリケーション設定
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

# データベース設定
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=

# メール設定
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

# 外部API(各自で取得が必要)
STRIPE_KEY=
STRIPE_SECRET=

新しいメンバーがプロジェクトに参加したら、以下の手順でセットアップします:

# 1. リポジトリをクローン
git clone https://github.com/your-team/project.git
cd project

# 2. .env.exampleをコピー
cp .env.example .env

# 3. アプリケーションキーを生成
php artisan key:generate

# 4. .envファイルを自分の環境に合わせて編集
vi .env

# 5. 依存関係をインストール
composer install
npm install

# 6. データベースをセットアップ
php artisan migrate

環境ごとの設定ファイル管理

複数の環境(ローカル、ステージング、本番)を管理する場合、以下のような命名規則を使用します:

.env              # ローカル開発環境(Gitで管理しない)
.env.example      # テンプレート(Gitで管理する)
.env.testing      # テスト環境(Gitで管理しない)
.env.staging      # ステージング環境(サーバー上で管理)
.env.production   # 本番環境(サーバー上で管理)

Dockerとの組み合わせ

Docker環境では、環境変数の管理方法が少し異なります。

docker-compose.yml:

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/var/www/html
    environment:
      - APP_ENV=local
      - APP_DEBUG=true
      - DB_HOST=mysql
      - DB_DATABASE=laravel_db
      - DB_USERNAME=root
      - DB_PASSWORD=secret
    env_file:
      - .env  # .envファイルから環境変数を読み込む

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: laravel_db

Docker環境では、docker-compose.ymlで環境変数を直接指定するか、env_file.envファイルを読み込みます。

PHP/Laravel開発をさらに効率化する関連記事

env.phpと.envの使い分けをマスターしたら、Laravel開発の他のベストプラクティスや効率化ツールも学んで、さらに生産性を向上させましょう:

Laravel開発ツール・ベストプラクティス

環境管理・Docker活用

AI開発支援ツール

まとめ: env.phpと.envを正しく使い分けよう

この記事では、env.phpと.envの違いと、開発環境・本番環境での正しい使い分けを3ステップで解説しました。

重要なポイント:

  • .env: 人間が編集するテキストファイル、開発環境で使用
  • env.php: Laravelが生成するキャッシュファイル、本番環境で使用
  • 開発環境: キャッシュを使わず、常に.envを直接読み込む
  • 本番環境: php artisan config:cacheで必ずキャッシュを生成
  • 設定変更時: env.phpが存在する場合は必ずconfig:cacheを再実行

この使い分けを理解することで、「設定が反映されない…」「本番環境が遅い…」といった問題から解放されます。特にチーム開発では、.env.exampleを活用して環境設定を標準化し、セキュリティに配慮した運用を心がけましょう。

今日からLaravel開発で適切な環境変数管理を実践してみませんか?

公式ドキュメント: https://laravel.com/docs/configuration

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次