[CakePHP2.x]レプリケーション環境での保存先変更

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

タイトルとURLをコピーしました