【PHP8.x】getenv関数の使い方
getenv関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『getenv関数は、実行中のスクリプトが利用できる環境変数の値を取得する関数です』
第一引数に、取得したい環境変数の名前を文字列で指定します。例えば、データベースの接続情報やAPIキーといった、コードに直接記述すべきでない設定値を環境変数として外部で管理している場合に、その値を取得するために広く利用されます。この関数は、指定した名前の環境変数が存在すれば、その値を文字列として返します。もし指定した環境変数が存在しない場合はfalseを返すため、取得した値を利用する前にfalseでないことを確認する処理が推奨されます。オプションの第二引数にtrueを指定すると、putenv関数によって現在のリクエスト内でのみ設定されたローカルな環境変数のみを検索対象とします。$_ENVスーパーグローバル配列を使っても同様の情報を取得できますが、getenv関数はphp.iniの設定に依存せず、OSレベルの環境変数を直接参照する点で挙動が異なる場合があります。
構文(syntax)
1getenv(?string $name = null, bool $local_only = false): string|array|false
引数(parameters)
string $name, bool $local_only = false
- string $name: 取得したい環境変数名を指定する文字列
- bool $local_only = false: trueを指定すると、PHP自身の環境変数のみを検索します。デフォルトはfalseで、PHP自身の環境変数と、親プロセスから継承した環境変数の両方を検索します。
戻り値(return)
array|string|false
指定された環境変数の値、または全ての環境変数を連想配列として返します。指定した環境変数が存在しない場合は false を返します。
サンプルコード
PHP getenv() と $_ENV, $_SERVER の違いを理解する
1<?php 2 3/** 4 * 環境変数の取得方法 (getenv(), $_ENV, $_SERVER) の違いを示すサンプルコードです。 5 * 6 * putenv() を使って環境変数を設定し、それぞれの方法で取得を試みます。 7 * $_ENV や $_SERVER が環境変数を含むかどうかは、php.ini の `variables_order` 設定に依存します。 8 * (例: `variables_order = "EGPCS"` なら 'E' (Environment) が含まれ $_ENV がロードされます) 9 */ 10 11// 1. 環境変数を設定します。 12// putenv() は現在のプロセス環境に直接影響を与え、getenv() から参照可能になります。 13// ただし、$_ENV や $_SERVER はスクリプト実行開始時に一度だけロードされるため、 14// putenv() で設定した変数は通常それらには自動で反映されません。 15putenv('APP_ENV=development'); 16putenv('DB_HOST=localhost_via_putenv'); 17 18echo "--- 環境変数の取得方法の比較 ---\n\n"; 19 20// --- 1. getenv() を使用して環境変数を取得 --- 21// getenv() は常にOSの環境変数を参照し、putenv() で設定された変数も取得できます。 22echo "getenv('APP_ENV'): "; 23$appEnvGetenv = getenv('APP_ENV'); 24echo ($appEnvGetenv !== false ? $appEnvGetenv : '取得できませんでした (false)') . "\n"; 25 26echo "getenv('DB_HOST'): "; 27$dbHostGetenv = getenv('DB_HOST'); 28echo ($dbHostGetenv !== false ? $dbHostGetenv : '取得できませんでした (false)') . "\n"; 29 30echo "getenv('NON_EXISTENT_VAR'): "; 31$nonExistentGetenv = getenv('NON_EXISTENT_VAR'); 32echo ($nonExistentGetenv !== false ? $nonExistentGetenv : '取得できませんでした (false)') . "\n\n"; 33 34 35// --- 2. $_ENV スーパーグローバル変数を使用して環境変数を取得 --- 36// $_ENV は php.ini の `variables_order` に 'E' が含まれている場合にロードされます。 37// スクリプト実行開始時の環境変数のスナップショットであり、putenv() の変更は反映されません。 38echo "\$_ENV['APP_ENV']: "; 39$appEnvSuperglobal = $_ENV['APP_ENV'] ?? '$_ENV には存在しませんでした'; 40echo $appEnvSuperglobal . "\n"; 41 42echo "\$_ENV['DB_HOST']: "; 43$dbHostSuperglobal = $_ENV['DB_HOST'] ?? '$_ENV には存在しませんでした'; 44echo $dbHostSuperglobal . "\n"; 45 46echo "\$_ENV['NON_EXISTENT_VAR']: "; 47$nonExistentSuperglobal = $_ENV['NON_EXISTENT_VAR'] ?? '$_ENV には存在しませんでした'; 48echo $nonExistentSuperglobal . "\n\n"; 49 50 51// --- 3. $_SERVER スーパーグローバル変数を使用して環境変数を取得 --- 52// $_SERVER もスクリプト実行開始時にロードされます。Webサーバー経由の場合、 53// 環境変数やHTTPヘッダーなど、多くの情報が格納されることが多いです。 54// `variables_order` に 'E' や 'S' が含まれるかによって内容が変わります。 55echo "\$_SERVER['APP_ENV']: "; 56$appEnvServer = $_SERVER['APP_ENV'] ?? '$_SERVER には存在しませんでした'; 57echo $appEnvServer . "\n"; 58 59echo "\$_SERVER['DB_HOST']: "; 60$dbHostServer = $_SERVER['DB_HOST'] ?? '$_SERVER には存在しませんでした'; 61echo $dbHostServer . "\n"; 62 63echo "\$_SERVER['NON_EXISTENT_VAR']: "; 64$nonExistentServer = $_SERVER['NON_EXISTENT_VAR'] ?? '$_SERVER には存在しませんでした'; 65echo $nonExistentServer . "\n\n"; 66 67 68echo "--- まとめ ---\n"; 69echo "・getenv(): 現在のプロセス環境を直接参照します。putenv() で設定された変数も取得できます。\n"; 70echo "・\$_ENV: スクリプト実行開始時の環境変数の「スナップショット」です。\n"; 71echo " php.ini の `variables_order` に 'E' が必要です。putenv() の結果は自動で反映されません。\n"; 72echo "・\$_SERVER: スクリプト実行開始時の環境変数の「スナップショット」です。\n"; 73echo " Webサーバー経由の場合に多く使われ、`variables_order` に 'E' や 'S' が必要です。\n"; 74echo " putenv() の結果は自動で反映されません。\n\n"; 75echo "通常、getenv() は環境変数にアクセスするための最も信頼性の高い方法とされます。\n"; 76echo "フレームワークなどでは、.env ファイルから環境変数をロードし、getenv() を通じてアクセスするケースが多いです。\n"; 77
PHPのgetenv関数は、システムやWebサーバーによって設定された環境変数の値を取得するために使用します。この関数は、引数$nameに指定された環境変数の名前を検索し、見つかればその値を文字列として返します。環境変数が見つからない場合はfalseを返します。2番目の引数$local_onlyは、trueに設定するとローカル環境変数のみを検索しますが、通常はデフォルトのfalseで問題ありません。
環境変数の取得方法にはgetenv()の他に、スーパーグローバル変数である$_ENVや$_SERVERも存在し、それぞれの挙動が異なります。getenv()は、PHPプロセスが実行されている現在の環境から直接変数を参照するため、スクリプト内でputenv()関数を使って設定または変更した環境変数も即座に取得できます。
一方、$_ENVと$_SERVERは、PHPスクリプトが実行を開始した時点の環境変数の「スナップショット」を保持しています。そのため、putenv()でスクリプト実行中に変更した内容は、これらのスーパーグローバル変数には自動的に反映されません。また、$_ENVや$_SERVERに環境変数がロードされるかどうかは、php.ini設定ファイルのvariables_orderディレクティブによって制御されます。例えば、variables_orderにE(Environment)が含まれていなければ$_ENVは空になることがあります。
これらの違いから、環境変数にアクセスする際にはgetenv()が最も信頼性が高い方法とされています。多くのPHPフレームワークでも、設定ファイルなどから環境変数をロードし、getenv()を通じて利用することが推奨されています。
getenv()は、現在のプロセス環境から環境変数を直接取得し、putenv()で設定された変数もすぐに参照できますが、存在しない場合はfalseを返します。一方、$_ENVや$_SERVERは、スクリプト実行開始時に一度だけ環境変数を読み込む「スナップショット」であるため、putenv()による後からの変更は反映されません。これらのスーパーグローバル変数に環境変数が含まれるかは、php.iniのvariables_order設定(特に'E'や'S'の有無)に依存します。そのため、環境変数へのアクセスはgetenv()を使用することが最も確実で推奨される方法です。
PHPで環境変数を安全に取得する
1<?php 2 3/** 4 * 環境変数を安全に取得する関数。 5 * `getenv()` が期待通りに動作しない場合に、`$_SERVER` や `$_ENV` も試して環境変数を取得します。 6 * 7 * `getenv()` は通常、PHPプロセスが実行されている環境の変数を取得しますが、 8 * Webサーバー(Apache, Nginxなど)環境下では、Webサーバー起動時の環境変数が参照されるため、 9 * シェルで設定した環境変数がPHPに直接伝わらないことがあります。 10 * そのような場合に `$_SERVER` や `$_ENV` スーパーグローバル変数が役立つことがあります。 11 * 12 * @param string $name 取得したい環境変数名 13 * @return string|null 取得できた環境変数の値、または変数が存在しない場合はnull 14 */ 15function getEnvironmentVariable(string $name): ?string 16{ 17 // 最初に getenv() を試します 18 // getenv() は環境変数が設定されていない場合や、参照できない場合に false を返します。 19 $value = getenv($name); 20 if ($value !== false) { 21 return $value; 22 } 23 24 // getenv() で取得できなかった場合、$_SERVER スーパーグローバル変数をチェックします 25 // Webサーバー経由で設定された環境変数や、CGI/FastCGIからの情報が含まれることがあります。 26 if (isset($_SERVER[$name])) { 27 return $_SERVER[$name]; 28 } 29 30 // $_SERVER でも取得できなかった場合、$_ENV スーパーグローバル変数をチェックします 31 // $_ENV を利用するには、php.ini の `variables_order` に 'E' が含まれている必要があります。 32 if (isset($_ENV[$name])) { 33 return $_ENV[$name]; 34 } 35 36 // いずれの方法でも環境変数が取得できなかった場合 37 return null; 38} 39 40// ----------------------------------------------------------------------------- 41// サンプルコードの実行例 42// ----------------------------------------------------------------------------- 43 44// 取得したい環境変数名を定義します。 45// この変数名は、実行環境で事前に設定する必要があります。 46$targetEnvVarName = 'MY_APPLICATION_SETTING'; 47 48echo "--- 環境変数 '" . $targetEnvVarName . "' の取得を試みます ---\n"; 49 50// getEnvironmentVariable関数を呼び出して環境変数を取得 51$envValue = getEnvironmentVariable($targetEnvVarName); 52 53if ($envValue !== null) { 54 echo sprintf("環境変数 '%s' の値: '%s'\n", $targetEnvVarName, $envValue); 55 echo "環境変数が正常に取得できました。\n"; 56} else { 57 echo sprintf("環境変数 '%s' を取得できませんでした。\n", $targetEnvVarName); 58 echo "考えられる理由と対処法:\n"; 59 echo "1. 環境変数が設定されていない、またはPHPプロセスから参照できない状況です。\n"; 60 echo " - **シェル環境で実行する場合(例: CLI)**:\n"; 61 echo " コマンド実行前に `export %s=some_value` のように環境変数を設定してください。\n"; 62 echo " 例: `export %s=production && php your_script.php`\n"; 63 echo " - **Webサーバー環境で実行する場合(例: Apache, Nginx + PHP-FPM)**:\n"; 64 echo " Webサーバーの設定ファイル (例: Apacheのhttpd.confや.htaccess) \n"; 65 echo " またはPHP-FPMの設定ファイル (例: www.conf) で設定する必要があります。\n"; 66 echo " 例 (Apacheのhttpd.confまたは.htaccess): `SetEnv %s production`\n"; 67 echo " 例 (PHP-FPM pool config file): `env[%s] = production`\n"; 68 echo "2. `php.ini` の `variables_order` 設定に `E` が含まれていないため、\n"; 69 echo " `$_ENV` が利用できない可能性があります。PHPのinfoページ (`phpinfo()`) で確認してみてください。\n"; 70} 71 72echo "\n--- 別の環境変数 'PATH' の取得例 ---\n"; 73// 多くのシステムでPATHは設定されているため、動作確認に便利です。 74$pathValue = getEnvironmentVariable('PATH'); 75if ($pathValue !== null) { 76 echo sprintf("環境変数 'PATH' の値 (先頭50文字): '%s...'\n", substr($pathValue, 0, 50)); 77} else { 78 echo "環境変数 'PATH' を取得できませんでした。\n"; 79} 80 81?>
PHPのgetenv関数は、実行中のPHPプロセスからシステム環境変数の値を取得するために使用されます。この関数は、引数$nameで指定された環境変数名に対応する値を文字列として返しますが、変数が存在しない場合はfalseを返します。Webサーバー環境下では、getenvがWebサーバー起動時の環境変数を参照するため、シェルで設定した変数がPHPから直接取得できないことがあります。
このサンプルコードでは、getenvで取得できない場合に備え、$_SERVERや$_ENVスーパーグローバル変数も確認するgetEnvironmentVariable関数を提供しています。この関数は、getenv、$_SERVER、$_ENVの順に環境変数を探索し、より確実に値を取得します。$_SERVERはWebサーバーからの情報、$_ENVはPHPが認識する環境変数(php.iniのvariables_orderに'E'が必要)を含みます。
MY_APPLICATION_SETTINGやPATHなどの環境変数の取得例を示しており、変数が取得できない場合は、CLIならexportコマンド、Webサーバー環境なら設定ファイル(例: ApacheのSetEnv、PHP-FPMのenv[])で設定するか、php.iniのvariables_order設定を確認する必要があります。これにより、アプリケーションで環境変数を安全に利用できるようになります。
getenv()関数はWebサーバー環境でシェルで設定した環境変数を直接参照できない場合があり、期待通りに動作しないことがあります。このため、サンプルコードのように$_SERVERや$_ENVスーパーグローバル変数も併用して確認するカスタム関数を使うのがより確実です。特に$_ENVを利用するには、php.iniのvariables_order設定に'E'が含まれているかを確認してください。環境変数の設定方法は、CLI実行時とWebサーバー(Apache, Nginxなど)実行時で異なりますので、それぞれの環境に合わせた設定方法を理解することが重要です。カスタム関数がnullを返す場合は、指定された環境変数がどの方法でも取得できなかったことを意味します。