環境差異を吸収する方法

ローカルの開発サーバ、ステージングサーバ、本番サーバ。ある程度の規模になると同じプログラムを複数の環境で動かす必要がある。
URLやDB接続のためのDSNなどは、当然各環境によって変わってくる。

そこで、環境変数に環境名(release|stg|dev|localdev)などを持たせ、それを設定ファイル読み込みに使う。

Apache環境変数で設定
httpd.confレベルで、 ディレクティブで設定

<Directory "/path/to/DocumentRoot">
    SetEnv SERVER_STATUS release
</Directory>

バッチ起動時に環境変数で設定

$ export SERVER_STATUS='release' && cmmand


これを、例えばphpならば、$_SERVER['SERVER_STATUS']、$_ENV['SERVER_STATUS']で取得し、設定ファイル読み込みに使う。

<?php
$server_status = $_SERVER['SERVER_STATUS'];
if (!$server_status) $server_status = $_ENV['SERVER_STATUS'];
require 'config_' . $server_status . '.php';

とか。


追記(2008-02-08)
$_ENVとか$_SERVERとかはvariables_orderの設定に依存するから getenvを使ったほうがいいよ。という突っ込みを同僚から受けました。
http://jp.php.net/manual/ja/ini.core.php#ini.variables-order
i_ogiさんの記事に詳しい説明があります。
php.ini-recommendedで、variables_orderがGPCSである理由と、PHP5のauto_globals_jitCommentsAdd Star」
d:id:i_ogi:20071217:1197912203