レプリケーション環境下でマスター、スレーブ環境の切り替えを
行う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設定をする必要があります。