目的
現在コードが 本番 / 開発環境 / Unit Test のうち、どの環境で実行されてるか実行時に知りたい。
環境
- 本番
- Google AppEngine
- 開発環境
- nginx + php-fpm
- Unit Test
- phpunit
解決方法
それぞれの環境に識別用の環境変数を定義して、それを参照します。
環境変数の定義方法
本番 (Google AppEngine)
app.yaml
で環境変数を設定できます。
app.yaml
env_variables:
SERVER_ENV: prod
開発環境 (Docker)
下記は nginx
の設定ファイル default.conf (でなくても良いけど)
の要約です。
default.conf
location ~ \.php$ {
# ↓ サーバプロセスの環境変数を設定する
fastcgi_param SERVER_ENV dev;
}
Unit Test (phpunit)
phpunit.xmlで環境変数を設定できます。
phpunit.xml
<phpunit bootstrap="bootstrap.php" >
<php>
<env name="SERVER_ENV" value="test" />
</php>
</phpunit>
おまけ (PHP built-in server)
SERVER_ENV=dev php -S localhost:8080 -t public
built-in server は $_SERVER
に環境変数を import しないので参照時に注意が必要です。
併せて参照: PHPのビルトインサーバでは、環境変数を$_SERVERから読み出せない
判定コード
上記のように環境変数を設定しておけば php 側では、下記のように取得できます。
// 下記3つのいずれでも取得できます
echo $_SERVER['SERVER_ENV'];
echo $_ENV['SERVER_ENV'];
echo getenv('SERVER_ENV');
関数にするとこんな感じ。
function getEnvName(): string
{
$serverEnv = getenv('SERVER_ENV');
switch ($serverEnv) {
case 'prod':
case 'dev':
case 'test':
break;
default:
$serverEnv = 'unknown';
break;
}
return $serverEnv;
}