質問: phpからmysqlへのクエリの振り分け方法 lamp構成のwebアプリケーションでのdbサーバ増設について質問です。 今までdbサーバ(mysql)1台で運用していたのですが、 1台増設してレプリケーションを行うことになりました。 dbサーバ1:マスター(新設) dbサーバ2:スレーブ そこで、phpスクリプトを全面的に見直して、以下のように dbへのコネクション部分を変更する必要が出てきました。 ・コネクション中に一度でも更新系のクエリを発行する場合はマスターへ ・それ以外はスレーブへ これをインクルード先まで追って調査するのは現実的ではないため、 一括で振り分ける方法を探しています。 雑で申し訳ありませんが、環境は以下の通りです。 php 5.1.6 (cli) pear::db(1.7.13) mysql 4.1.22
回答: まったくの未検証ですが、 pear::dbのインスタンスを作成する場所で、代わりに、pear::dbのインスタンス(マスターとスレーブの二つ)に接続するハブクラスを作成したら最小限の改修でいくかもしれませんが、どうでしょう。 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のインスタンス作成箇所を と記述してあるものを "マスタのdsn", 'slave'=>"スレーブのdsn")); ?> と記述してやると、オーバーロードした__callメソッドにて、基本的に全てmasterに振って、queryメソッドで「select」から始まるもののみ、スレーブに振り分ける、ということが出来ます。 pear::dbをちゃんと利用したことが無いので、queryメソッドだけを振り分ければそれでいけるのかは分かりませんが・・・