5

現在、PHP PDO を使用してデータベースにアクセスしています。それはすべて絶対にうまく機能しています。ただし、サーバーのセットアップにリードレプリカを追加する予定なので、それに応じてコードを調整したいと考えています。

私の現在の行動計画は、データベース資格情報の詳細の配列を保存することです。マスター MySQL データベース用の 1 つの「読み取りと書き込み」セットと、「読み取りレプリカ」用の任意の数の資格情報。

私がやりたいことは、「モード」と呼ばれる PDO クラスにメソッドを追加することです。ここで、「読み取り」または (デフォルト) 「書き込み」などのモードが渡されます。これを渡すことで (例: $dbh->mode("read"); )、ランダム リード レプリカの詳細を検索し (どれが大騒ぎされていないか)、それらの詳細を接続に使用できます。次に、レプリカからの読み取りが完了したら、別の $dbh->mode("default") を実行して、書き込みモードに戻します。これにより、INSERT、UPDATE などを使用できます。

PDO オブジェクトを単純に破棄して新しいオブジェクトを作成することなく、これを行うことはできますか? オブジェクトが既に存在する後で、接続の詳細を簡単に変更できますか?

これまでのところ、次のものがあります(ほとんど何もありませんが、その始まりを考えました)。

Class SwitchablePDO extends PDO
{
    public function mode($mode = "default") 
    {
        // Use the credentials for my master read and write server by default

        if($mode == "read")
        {
            // Use one the credentials for my read replicas (randomly choose)
        }

    }
}

これに関するヘルプをいただければ幸いです。

4

2 に答える 2

2

モードを扱うよりも、完全に異なるデータベース接続オブジェクトを設定したいと思います。モードを使用すると、コードの一部がモードを設定せず、前のコードのモードに依存する状況に必然的に遭遇し、別のコンテキストで呼び出されると失敗します。これは、順次結合として知られています。

ファクトリ メソッドまたは依存性注入コンテナーによって提供される複数のオブジェクトを使用して、コードの各部分が必要なデータベース接続 (マスターまたはスレーブなど) を指定していることを確認します。

おまけとして、マスター/スレーブを名前として使用するのを避け、代わりに分析など、実行するタスクのタイプに関連する名前を使用してください。これにより、コードを調べて関連するすべての部分を見つけることなく、使用するサーバーを変更できます。コードの。

于 2012-07-27T13:41:14.657 に答える
1

読み取りモードと書き込みモード用に別々のクラスを作成し、次にそれを SwitchablePDO クラスのプライベート/保護されたプロパティに割り当てます。次に呼び出すmode()と、使用するプロパティを設定するだけです。ここにいくつかの擬似コードがあります:

class WriteablePDO extends PDO
{
    // methods
}

class ReadablePDO extends PDO
{
    // methods
}

class SwitchablePDO
{
    protected $_mode = 'read'; // default
    protected $_read;
    protected $_write;

    public function __construct()
    {
        $this->_read = new ReadablePDO();
        $this->_write = new WriteablePDO();
    }

    public function mode($key)
    {
        if ($key === 'read')
        {
            $this->_mode = '_read';
        }
        elseif ($key === 'write')
        {
            $this->_mode = '_write';
        }
    }

    public function __call($method, $arguments)
    {
        return call_user_func_array(array($this->{$this->_mode}, $method), $arguments);
    }

}
于 2012-07-27T12:17:16.507 に答える