WHAT'S NEW?
Loading...

Yii 1.1 | 環境別に設定ファイルを読み込む

環境というのは、例えばWindowsにVirtualBoxを乗せてその上でCentOSを走らせているようなVM環境で開発してたら、それがローカル環境だ。

どこかのサーバに一式アップロードし、自分たちと限られた人たちだけが閲覧可能な状態であれば、いわゆるステージングと呼ばれる環境かもしれない。

クライアントに最終チェックしてもらう前に、自分たちで限りなく本番に近い環境で且つ、自由にいじれる先進的な環境も持っているなら、それはテストサーバなのかもしれない。

いずれにせよ、環境というのはサーバ、基盤のことと考えていいと思う。でもこれらの環境には当然ながら設定に差異があり、設定ファイルにそれぞれ環境から判別させるロジックを書いていたら、面倒くさい。

それならば最初から環境名をファイル名にした設定ファイルを用意しておき、設定を読み込むときに一度だけ環境の判別をすればオーバーヘッドも少ないし、何しろファイルの中身を書き換えるだけでその環境に適応するわけだから、わかりやすくなる。

CakePHPではcore.phpという名前だったけど、Yiiの場合、具体的に言うと、/protected/config/main.phpを設定ファイルとして読み込む。

これをテストサーバなら/protected/config/testdrive.php、ステージングなら/protected/config/staging.php、自分のマシンだけの環境なら/protected/config/local.phpを読み込む、というようにしておくと便利だ。

コピペというのはだれでもできる

というわけで早速そのような仕組みを実装できるように編集しておこう。

まずは/protected/config/main.phpを幾つかコピーし、それぞれ本番向けに/protected/config/product.php、開発用に/protected/config/local.phpなんかに、必要に応じて複製しておこう。

取り急ぎ今回は開発環境と本番環境の2個、つまり

  • /protected/config/product.php
  • /protected/config/local.php

を用意した。main.php自体は一応残しておくので、合計で3つの設定ファイルがあることになる。

Yiiにはもともと

  • /protected/config/console.php
  • /protected/config/test.php

があるので、以下の様な構成になる。



さて、次にこれらの設定ファイルを、環境によって自動的に読み分ける仕組みを実装しようじゃないか。

半ケツを出して判決を下そう!

一番手頃なのは、もともとmain.phpを読み込むファイルで判別ロジックを追加することだ。
そのために、まず何をしなければ行けないかというと、何を基準に環境を判別するか、を決める事だ。

最初の一度の設定だけで後は何もしなくて良い方法として、Apacheの環境変数を元にする方法がある。

たいていの人はApacheのVirtualHostの設定などをしたことがあるとは思うけど、そのディレクティブの中に、以下のように、好きな環境変数名を設定し、好きな値を設定しておけばOKだ。


開発環境ではENVIRONMENT_FORをlocalに設定し、本番ではproductにする、という流れ。
これならいちいち設定ファイルを書きなおしたりすることはなくなり、半自動化が完了する。

そもそもITと言うのは情報を扱う処理を自動化するという意味もあるので、こういった

最初だけ面倒だけど一度の設定で後が楽

というタスクはこなしておくと良いかも。
SetEnvでENVIRONMENT_FOR(もちろん別の名前でもOK)の設定を追加したら、Apacheを再起動しよう。


これで環境の違いを簡単に取得できるようになった。

判別しまくろう!

さて、最後に、これら環境の判別をするロジックだ。
/testdrive/inde.phpを使う。


/protected/config/main.phjpを読み込んでいた場所を上記のように書き換えてしまおう。

せっかくなのでソースコードをコピペできるようにしておくよ。
// change the following paths if necessary
$yii = dirname(__FILE__) . '/../framework/yii.php';
$config = dirname(__FILE__) . '/protected/config/'
        . ((isset($_SERVER['ENVIRONMENT_FOR']))?$_SERVER['ENVIRONMENT_FOR']:'product')
        . '.php';

// remove the following lines when in production mode
defined('YII_DEBUG') or define('YII_DEBUG', true);
// specify how many levels of call stack should be shown in each log message
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL', 3);

require_once($yii);
Yii::createWebApplication($config)->run();

さて、どうだろうか。

Yiiにyii-debug-toolbarが入っているなら、各設定ファイルのparamに環境名を追加して、ツールバーで見てみるのも良いかも。

各設定ファイルの最下段付近で設定してあるparamキーを以下のように編集してみるといいだろう。『environment_for』を追加してある。


これもせっかくなのでコピペできるようにしておくよ。
 'params'=>array(
    // environment name
    'environment_for' => basename(__FILE__, '.php'),
  // this is used in contact page
  'adminEmail'=>'webmaster@example.com',
 ),

さて、yii-debug-toolbarで、Settings、Application Paramsを見てみよう。


このようにばっちり環境名を拾えている。
なかなか愉快だね。

さて、今回はここまで。

次回はPHPのフォーマットに関するいやらしくも美しいツールを紹介しながら使って見る予定。