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

タイトル: $_ENV (PHP スーパーグローバル変数)
SEOタイトル: PHP $_ENV 完全ガイド(getenv/putenv/variables_order/Laravel env helper/Docker)

この記事の要点
  • $_ENV は OS の環境変数を読むスーパーグローバル配列
  • $_ENV['HOME']getenv('HOME') はほぼ同等。後者は常に使えて推奨
  • php.ini の variables_order = "EGPCS"E が無いと空になる
  • CLIでは普通に動く、Web (CGI/FPM)は SAPI 経由のものだけ取れる
  • Laravel/Symfony の env().env ファイルを読み込んで $_ENVgetenv 経由で取得

$_ENV とは

$_ENV は PHP スーパーグローバル変数の1つで、OSの環境変数を連想配列で取得します。サーバ設定・実行コンテキスト依存の値(PATH、HOME、LANG、自前の APP_ENV など)を読むのに使います。

// CLI で実行
var_dump($_ENV['HOME']);     // string(11) "/home/taro"
var_dump($_ENV['LANG']);     // string(11) "ja_JP.UTF-8"
var_dump($_ENV['PATH']);     // string(...) "/usr/local/bin:..."

// 自作の環境変数
// $ APP_ENV=production php script.php
echo $_ENV['APP_ENV'];       // production

$_ENV が空になる: variables_order 設定

php.ini の variables_order ディレクティブは、スーパーグローバル変数のうちどれを初期化するかを決めます。E(ENV)が含まれていないと $_ENV空配列になります。

; php.ini
; E = $_ENV
; G = $_GET
; P = $_POST
; C = $_COOKIE
; S = $_SERVER

; 既定(多くの環境)
variables_order = "GPCS"          ; ← E 無し → $_ENV は空!

; ENV も使いたい
variables_order = "EGPCS"         ; ← 推奨

; レガシー
variables_order = "EGPCS"
register_argc_argv = On           ; CLI で $argv / $argc を使うなら
// 現在の設定を確認
var_dump(ini_get('variables_order'));   // "EGPCS" or "GPCS"

// 反映確認
var_dump($_ENV);                        // 空 or 環境変数全部

// 実行時上書き(recommend ini で設定)
ini_set('variables_order', 'EGPCS');    // 効かないことが多い

getenv() と putenv()

getenv()variables_order の影響を受けず常に動きます。安全策として推奨:

// 取得
$home = getenv('HOME');                 // "/home/taro"
$home = getenv('HOME', true);           // ローカル環境のみ(thread-safe)

// すべての環境変数を配列で
$envs = getenv();                       // PHP 7.1+

// 設定(現在のプロセス + 子プロセスにのみ反映)
putenv('APP_ENV=production');
echo getenv('APP_ENV');                  // production

// 削除
putenv('APP_ENV');                       // 値無しで削除
方法取得設定variables_order の影響
$_ENV['X']○(変数代入)受ける(E 必須)
getenv('X')×受けない
putenv('X=Y')×-
$_SERVER['X']○(SAPI依存)×S 必要

CLI vs Web の挙動差

CLI (php script.php)

シェルから起動した子プロセスなのでシェルの全環境変数を継承します:

export APP_ENV=production
export DB_HOST=db.example.com
php -r 'var_dump($_ENV);'
// array(...) { ["APP_ENV"]=> "production" ["DB_HOST"]=> "db.example.com" ... }

Web (PHP-FPM / mod_php)

Web サーバ経由ではシェルの環境変数は引き継がれません。FPM ではプール設定で明示する必要があります:

; /etc/php-fpm.d/www.conf
[www]
; 親環境変数を引き継ぐかどうか
clear_env = no       ; ← yes が既定。これを no にすると親環境を引き継ぐ

; 明示的に渡す(推奨)
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[APP_ENV] = production
env[DB_HOST] = db.example.com
# Apache mod_php
SetEnv APP_ENV production
PassEnv DB_HOST

# nginx + FPM は php-fpm.conf 経由

Laravel / Symfony の env() ヘルパー

モダンな PHP フレームワークは.env ファイルvlucas/phpdotenv ライブラリで読み込み、$_ENVgetenv 経由で参照できるようにします:

# .env (Laravel)
APP_ENV=production
APP_DEBUG=false
DB_HOST=db.example.com
DB_PORT=3306
DB_PASSWORD="p@ss w/space"
// Laravel
config('app.env');           // 推奨(config キャッシュ可能)
env('APP_ENV', 'local');     // .env 直接(config キャッシュ後はNG)

// Symfony
$_ENV['APP_ENV'];
$_SERVER['APP_ENV'];
// または DI で $env パラメータ受け取り

// 素の vlucas/phpdotenv
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
echo $_ENV['DB_HOST'];

env() を直接使うのが NG なケース

Laravel で php artisan config:cache 実行後は .env が読み込まれなくなり、env()常に null を返します。必ず config() 経由で使うのが鉄則です。

Docker での環境変数渡し

# Dockerfile
FROM php:8.3-fpm
# ビルド時に固定値(イメージに焼き付く)
ENV APP_ENV=production
# docker-compose.yml
services:
  web:
    image: my-app
    environment:
      APP_ENV: production
      DB_HOST: db
      DB_PASSWORD: ${DB_PASSWORD}     # ホストの環境変数から取得
    env_file:
      - .env.production               # ファイルから一括投入
# 単発 docker run
docker run -e APP_ENV=production -e DB_HOST=db my-app

# 環境変数ファイル
docker run --env-file .env.prod my-app

# Kubernetes
# - ConfigMap / Secret から env: 経由で注入

セキュリティ上の注意

  • 機密情報(API キー / DB パスワード)は環境変数で渡すのが定番だが、phpinfo() で漏洩する → 本番では無効化
  • ps -ef でプロセス引数や環境変数が見える環境では、ファイル + ENV_FILE 方式か Secret Manager を併用
  • ログに $_ENV 全部を出力しない(パスワードが漏れる)
  • クラウド: AWS Parameter Store / Secrets Manager、GCP Secret Manager、Vault などで管理し、起動時に $_ENV へ展開

FAQ

Q: $_ENV$_SERVER の違いは?
A: 同じ環境変数を両方が持つことがあります。SAPI 経由(Web)の値$_SERVEROS 環境変数$_ENV が主だが境界は曖昧。確実に取りたいなら getenv()

Q: Web で $_ENV が空
A: PHP-FPM の clear_env = yes(既定)が原因。env[KEY] = value で明示するか clear_env = no に。

Q: .env ファイルは本番でもコミットしていい?
A: 絶対にダメ。.gitignore 必須。.env.example だけリポジトリに置き、本番値はサーバ側で配置。