【PHP8.x】getenv関数の使い方

作成日: 更新日:

『getenv関数は、実行中のスクリプトが利用できる環境変数の値を取得する関数です』 第一引数に、取得したい環境変数の名前を文字列で指定します。例えば、データベースの接続情報やAPIキーといった、コードに直接記述すべきでない設定値を環境変数として外部で管理している場合に、その値を取得するために広く利用されます。この関数は、指定した名前の環境変数が存在すれば、その値を文字列として返します。もし指定した環境変数が存在しない場合はfalseを返すため、取得した値を利用する前にfalseでないことを確認する処理が推奨されます。オプションの第二引数にtrueを指定すると、putenv関数によって現在のリクエスト内でのみ設定されたローカルな環境変数のみを検索対象とします。$_ENVスーパーグローバル配列を使っても同様の情報を取得できますが、getenv関数はphp.iniの設定に依存せず、OSレベルの環境変数を直接参照する点で挙動が異なる場合があります。

基本的な使い方

構文(syntax)

getenv(?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で環境変数を安全に取得する

<?php

/**
 * 環境変数を安全に取得する関数。
 * `getenv()` が期待通りに動作しない場合に、`$_SERVER` や `$_ENV` も試して環境変数を取得します。
 *
 * `getenv()` は通常、PHPプロセスが実行されている環境の変数を取得しますが、
 * Webサーバー(Apache, Nginxなど)環境下では、Webサーバー起動時の環境変数が参照されるため、
 * シェルで設定した環境変数がPHPに直接伝わらないことがあります。
 * そのような場合に `$_SERVER` や `$_ENV` スーパーグローバル変数が役立つことがあります。
 *
 * @param string $name 取得したい環境変数名
 * @return string|null 取得できた環境変数の値、または変数が存在しない場合はnull
 */
function getEnvironmentVariable(string $name): ?string
{
    // 最初に getenv() を試します
    // getenv() は環境変数が設定されていない場合や、参照できない場合に false を返します。
    $value = getenv($name);
    if ($value !== false) {
        return $value;
    }

    // getenv() で取得できなかった場合、$_SERVER スーパーグローバル変数をチェックします
    // Webサーバー経由で設定された環境変数や、CGI/FastCGIからの情報が含まれることがあります。
    if (isset($_SERVER[$name])) {
        return $_SERVER[$name];
    }

    // $_SERVER でも取得できなかった場合、$_ENV スーパーグローバル変数をチェックします
    // $_ENV を利用するには、php.ini の `variables_order` に 'E' が含まれている必要があります。
    if (isset($_ENV[$name])) {
        return $_ENV[$name];
    }

    // いずれの方法でも環境変数が取得できなかった場合
    return null;
}

// -----------------------------------------------------------------------------
// サンプルコードの実行例
// -----------------------------------------------------------------------------

// 取得したい環境変数名を定義します。
// この変数名は、実行環境で事前に設定する必要があります。
$targetEnvVarName = 'MY_APPLICATION_SETTING';

echo "--- 環境変数 '" . $targetEnvVarName . "' の取得を試みます ---\n";

// getEnvironmentVariable関数を呼び出して環境変数を取得
$envValue = getEnvironmentVariable($targetEnvVarName);

if ($envValue !== null) {
    echo sprintf("環境変数 '%s' の値: '%s'\n", $targetEnvVarName, $envValue);
    echo "環境変数が正常に取得できました。\n";
} else {
    echo sprintf("環境変数 '%s' を取得できませんでした。\n", $targetEnvVarName);
    echo "考えられる理由と対処法:\n";
    echo "1. 環境変数が設定されていない、またはPHPプロセスから参照できない状況です。\n";
    echo "   - **シェル環境で実行する場合(例: CLI)**:\n";
    echo "     コマンド実行前に `export %s=some_value` のように環境変数を設定してください。\n";
    echo "     例: `export %s=production && php your_script.php`\n";
    echo "   - **Webサーバー環境で実行する場合(例: Apache, Nginx + PHP-FPM)**:\n";
    echo "     Webサーバーの設定ファイル (例: Apacheのhttpd.confや.htaccess) \n";
    echo "     またはPHP-FPMの設定ファイル (例: www.conf) で設定する必要があります。\n";
    echo "     例 (Apacheのhttpd.confまたは.htaccess): `SetEnv %s production`\n";
    echo "     例 (PHP-FPM pool config file): `env[%s] = production`\n";
    echo "2. `php.ini` の `variables_order` 設定に `E` が含まれていないため、\n";
    echo "   `$_ENV` が利用できない可能性があります。PHPのinfoページ (`phpinfo()`) で確認してみてください。\n";
}

echo "\n--- 別の環境変数 'PATH' の取得例 ---\n";
// 多くのシステムでPATHは設定されているため、動作確認に便利です。
$pathValue = getEnvironmentVariable('PATH');
if ($pathValue !== null) {
    echo sprintf("環境変数 'PATH' の値 (先頭50文字): '%s...'\n", substr($pathValue, 0, 50));
} else {
    echo "環境変数 'PATH' を取得できませんでした。\n";
}

?>

PHPのgetenv関数は、実行中のPHPプロセスからシステム環境変数の値を取得するために使用されます。この関数は、引数$nameで指定された環境変数名に対応する値を文字列として返しますが、変数が存在しない場合はfalseを返します。Webサーバー環境下では、getenvがWebサーバー起動時の環境変数を参照するため、シェルで設定した変数がPHPから直接取得できないことがあります。

このサンプルコードでは、getenvで取得できない場合に備え、$_SERVER$_ENVスーパーグローバル変数も確認するgetEnvironmentVariable関数を提供しています。この関数は、getenv$_SERVER$_ENVの順に環境変数を探索し、より確実に値を取得します。$_SERVERはWebサーバーからの情報、$_ENVはPHPが認識する環境変数(php.inivariables_orderに'E'が必要)を含みます。

MY_APPLICATION_SETTINGPATHなどの環境変数の取得例を示しており、変数が取得できない場合は、CLIならexportコマンド、Webサーバー環境なら設定ファイル(例: ApacheのSetEnv、PHP-FPMのenv[])で設定するか、php.inivariables_order設定を確認する必要があります。これにより、アプリケーションで環境変数を安全に利用できるようになります。

getenv()関数はWebサーバー環境でシェルで設定した環境変数を直接参照できない場合があり、期待通りに動作しないことがあります。このため、サンプルコードのように$_SERVER$_ENVスーパーグローバル変数も併用して確認するカスタム関数を使うのがより確実です。特に$_ENVを利用するには、php.inivariables_order設定に'E'が含まれているかを確認してください。環境変数の設定方法は、CLI実行時とWebサーバー(Apache, Nginxなど)実行時で異なりますので、それぞれの環境に合わせた設定方法を理解することが重要です。カスタム関数がnullを返す場合は、指定された環境変数がどの方法でも取得できなかったことを意味します。

【PHP8.x】getenv関数の使い方 | いっしー@Webエンジニア