レプリケーション環境下でマスター、スレーブ環境の切り替えを
行うAPI
設定
database.phpにマスターとスレーブの接続設定を書く
ルールはスレーブ用の設定名の後ろに_master を付けた
マスター用の設定を記述する
例)
$default = array( スレーブの設定 );
$default_master = array( マスターの設定 );
各ファイルにメソッドを追加
AppController.php
/* コントローラーからマスタースレーブ切り替え*/
/* App:uses に登録されているmodelすべてを切り替える*/
/*$mode 0:スレーブ 1:マスター*/
function setMaster($mode){
foreach($this->uses as $model){
$this->{$model}->setMaster($mode);
}
return true;
}
AppModel.php
var $setMaster=0;
/*マスタースレーブ切り替え*/
/*アソシエーション定義されているmodelもすべて切り替え*/
/*$mode 0:スレーブ 1:マスター*/
function setMaster($mode = 1){
//_master を消して強制的に通常モードへ
$this->useDbConfig = str_replace('_master','',$this->useDbConfig);
if($mode==1){
$this->useDbConfig = $this->useDbConfig.'_master';
}
$this->setMaster=$mode;
$this->setDataSource($this->useDbConfig);
//アソシエーションモデルの接続先変更
$as_list=array('hasOne','belongsTo','hasMany','hasAndBelongsToMany');
foreach($as_list as $as)
foreach($this->{$as} as $model => $c){
if(!empty($c['className'])){ //classNameがあれば優先、無ければ連想配列キーをクラス名にする
$model = $c['className'];
}
$this->{$model}->setMaster($mode);
}
}
/* 現在のモードを取得 */
function getMode(){
return $this->setMaster;
}
API一つですべてのmodelの接続先が書き変わるので便利です。
通常はAppコントローラーのsetMaster()メソッドで切り替えることが可能です。
ただし、コントローラーやモデルに登録されているモデルだけなので、手動でロードされたものは個別にmodel内のAPIをコールする必要があります。
また、すべてのモデルを書き換えてしまうため、マスターしかないモデルについても、database.phpにマスター用、スレーブ用両方のDB設定をする必要があります。
