- ベストアンサー
PHPからMySQLへのクエリの振り分け方法
- LAMP構成のWebアプリケーションでのDBサーバ増設について質問です。
- DBサーバ1台で運用していたが、増設してレプリケーションを行うことになった。
- PHPスクリプトを全面的に見直し、クエリの振り分け方法を探している。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
まったくの未検証ですが、 PEAR::DBのインスタンスを作成する場所で、代わりに、PEAR::DBのインスタンス(マスターとスレーブの二つ)に接続するハブクラスを作成したら最小限の改修でいくかもしれませんが、どうでしょう。 <?php class DBR{ public static function connect($dsn){ return new DBR_mysql($dsn); } } class DBR_mysql{ protected $DB = array(); public function __construct($dsn){ $this->DB['master'] = DB::connect($dsn['master']); $this->DB['slave'] = DB::connect($dsn['slave']); } public function __call($method, $params){ if($method == 'query'){ if(preg_match('/^\s*SELECT/i', $params[0])){ return call_user_func_array(array($this->DB['slave']), $params); } } return call_user_func_array(array($this->DB['master']), $params); } } ?> このようにすれば、PEAR::DBのインスタンス作成箇所を <?php $obj = DB::connect("DSN情報"); ?> と記述してあるものを <?php $obj = DBR::connect(array('master'=>"マスタのDSN", 'slave'=>"スレーブのDSN")); ?> と記述してやると、オーバーロードした__callメソッドにて、基本的に全てmasterに振って、queryメソッドで「SELECT」から始まるもののみ、スレーブに振り分ける、ということが出来ます。 PEAR::DBをちゃんと利用したことが無いので、queryメソッドだけを振り分ければそれでいけるのかは分かりませんが・・・
お礼
hogehoge78さま とても参考になりました。ほぼそのままの内容でいけそうです。 迅速なご回答を頂きましてありがとうございました!