くまきち

山と旅と家族が大事。
でも激しい物欲が理性と財布のタガを飛ばす
最近は自転車も乗ってる

CakePHP: 使うDBを自動で切り替える

2009-05-26 20:29:38 | 雑記
 CakePHP でアクセスする DB を切り替える場合は、Model::useDbConfig の値を変えれば良い。
 変更する値は、config/database.php に書いてある。

 開発と本番でソースが同一の場合、データベースを自動的に切り分ける場合は、何らかの形で動的に判断して、値を書き換える必要がある。


 今回実際に出遭ったケースでは、ディレクトリが判別の鍵として使えるので、

 config/bootstrap.php 中で、

  config('constants');

として読み込ませている定数定義ファイル config/constants.php の中で、

  if ( strstr(dirname(__FILE__), 'master') ) { $testFlag=false; } else { $testFlag=true; }

として、今いる場所のパス文字列に master という文字があるかどうかで判別させている。

 これを利用して、

  if ( $testFlag ) {
   define('USE_SYSTEM', 'master');
  else {
   define('USE_SYSTEM', 'test');
  }


と定数を宣言させる。

んで、あとは AppModel (app_model.php) の中で、

  function __construct() {
   parent::__construct();
   if ( USE_SYSTEM == 'master' ) { $this->useDbConfig = 'default'; }
   else { $this->useDbConfig = 'test'; }
   }


として、利用 DB を切り替えている。

環境を判別する方法は、運用/開発環境によっていろいろあると思うが、いったん判別できてしまえば、app_model.php 中で切り替えられる。

PHPで呼び出し元の関数名を取得する

2009-05-26 20:01:09 | SEまわり
呼び出し元の関数名を取得する方法。

何階層か上のクラスに log() メソッドを実装して、そこでいろいろメッセージをログファイルに出力するようにした。

子クラスにて log() をコールした際、そのクラス名は get_class() で取得できる。

欲を言うとメソッド名も欲しいので、__FUNCTION__ を出力するようにした。



が、こうすると常に関数名は "log()" になってしまって、出力する意味がない。

なんとか、log() を呼び出している場所がどこの関数/メソッドなのかを知る必要がある。


調べたところ、debug_backtrace() 関数が使えることが分かった。

この関数から戻ってくるデータ量が非常に大きいのが気になるが、とりあえず、

$bt = debug_backtrace();
$function = $bt[1]['function'];

とすれば、ひとつ前の関数名を取り出せた。