2012年1月19日木曜日

PHPにて本番環境と開発環境の判別にはホスト名を使う


本番と開発では設定内容がことなる(接続先DBとか)ため、ファイルを分けたり、
以下のようにコメントアウトで設定を分けたりする方法が思いつきます。

# 開発用設定
#define("DB_NAME"         , "dev_hogedb");

# 本番用設定
define("DB_NAME"         , "hogedb");

でも本番と開発でファイルを分けると修正漏れがあったり、
他の箇所を修正したときにそのままファイルをアップできないという
不便さと危うさがあります。

そんなとき、ホスト名で振り分ける方法を教えてもらいました。


ホスト名をチェックして、開発機だったら開発用の設定、
本番機だったら本番用の設定とします。
さすがにホスト名は変わらないだろう、という判断。

■振り分け方法

$hostname = ホスト名を取得する。 こちら後述します。

# 本番環境   ホスト名production.com
if ( $hostname === 'production.com' ) {
  define("DB_NAME"    , "hogedb");

# 開発環境 ホスト名はdevelopment.com
} elseif( $hostname === 'development.com' ) { 
  define("DB_NAME"    , "dev_hogedb");

# それ以外はエラー
} else {
  // ERROR処理
    // ホスト名が変更になった場合、修正漏れがあった際にすぐ気づけるように。
}

こちら条件文は悩みどころかと思います。
エラー処理をいれず、不明だったら本番環境を見る、等は
システムの性格に関わると思いますので、適宜変える必要があります。
(===でなくても、strstr()とか使っているところもありました。)


■ホスト名の取得

取得する方法は以下があります。

 1. サーバ変数  $_SERVER['SERVER_NAME'] 

$hostname = $_SERVER['SERVER_NAME'];

これは楽で確実なので安心ですが、
Apache(Webサーバ)経由でない、cronや手動実行の場合は使えません。
サーバ変数は名のとおり、Webサーバの情報なので、シェルの場合空っぽです。
通常のサイトにはこちらの方が良いという印象。

 2. hostname コマンドで取得 

$hostname = exec( `/bin/hostname`, $output, $return_code );

unixコマンドのhostnameでホスト名を取得できます。
それをexec関数で実行します。
これならばcronでも手動実行でもホスト名が取得できます。
ただし、パフォーマンスがあまりよくないのと、
execを使うのがなんとなく好きではないのでシェルのみで利用する印象です。

 3. php_uname で取得する 

$hostname = php_uname("n");

こちら、知りませんでした。さっき調べて判明。

php_uname
http://jp.php.net/manual/ja/function.php-uname.php

これはPHPが稼動しているOSについての情報を取得してくれるそうで、
オプション「n」でホスト名のみ返却してくれるとのこと。

今度はこれを使ってみよう。