2

複数の (動的) PHP Mysqli 接続を使用する最良の方法は何ですか?

現在、単一の MySQL サーバーがあります。私のすべてのデータは、いくつかのデータベースのこのサーバーにあります。しかし、それほど遠くない将来、私のストレージのニーズは、このサーバーが処理できるよりも大きくなるでしょう. したがって、おそらく私がしなければならないことは、いくつかのデータベースをあるサーバーに配置し、いくつかのデータベースを別のサーバーに配置することです。そして将来的には、おそらくより多くのサーバーが登場するでしょう。

私のスクリプトを「将来的に証明する」ために、適切なサーバーを指すクラスが最善の解決策であると考えました。取得したいデータの「キー」を送信するだけで、そのサーバーに保存されているため、どの接続を使用する必要があるかがわかります。たとえば、いくつかのログを取得したい場合、キー「logs」を送信すると、クラスは、事前定義された接続「connection_A」を使用する必要があると言います。

クラスは現在次のようになっています。

Class DatabaseConnection {
    public $connection_name;

    function __construct($key){
        if($key=='logs'){
            $connection_name = 'connection_A';
        }
        elseif($key=='userdetails'){
            $connection_name = 'connection_B';
        }
    }
}

だから私が今やっていることは次のとおりです。

$connection_A = new mysqli($dbhosta, $dbusera, $dbpassa, $dbnamea);
$connection_B = new mysqli($dbhostb, $dbuserb, $dbpassb, $dbnameb);

$databaseConnection = new DatabaseConnection('logs');
$sql = "SELECT * FROM `something` WHERE `timestamp`>='12378912798'";
$result = ${$databaseConnection->connection_name}->query($sql);

これはうまくいきます。私が望んでいたほど「動的」ではありませんが。私は主に機能に関する問題に遭遇します。しかし、それには私がする必要がありました:

function something(){
    global $connection_A, $connection_B;

    $databaseConnection = new DatabaseConnection('logs');
    $sql = "SELECT * FROM `something` WHERE `timestamp`>='12378912798'";
    $result = ${$databaseConnection->connection_name}->query($sql);
}

また

function something(){
    $databaseConnection = new DatabaseConnection('logs');
    global ${$databaseConnection->connection};

    $sql = "SELECT * FROM `something` WHERE `timestamp`>='12378912798'";
    $result = ${$databaseConnection->connection_name}->query($sql);
}

どちらも非常にエレガントではなく、接続を追加したり、物事をシャッフルしたりすると、最初のものはかなりの作業になります。

そこで、次のようなことを考えました。

Class DatabaseConnection {
    public $connection_name;

    function __construct($key){
        if($key=='logs'){
            $connection_name = 'connection_A';
        }
        elseif($key=='userdetails'){
            $connection_name = 'connection_B';
        }
    }

    function connection(){
        $this->{$this->connection_name}();
    }

    function connection_A(){
        $connection_A = new mysqli($dbhosta, $dbusera, $dbpassa, $dbnamea);
        return $connection_A;
    }

    function connection_B(){
        $connection_B = new mysqli($dbhostb, $dbuserb, $dbpassb, $dbnameb);
        return $connection_B;
    }
}

そしてそれを次のように使用します:

$databaseConnection = new DatabaseConnection('logs');
$sql = "SELECT * FROM `something` WHERE `timestamp`>='12378912798'";
$result = $databaseConnection->connection->query($sql);

ただし、特定のスクリプトには、スクリプトが実行されるたびに数百回実行される関数があります。(挿入物など)。では、これで 300 接続などを開くことはできないのでしょうか?

Mysqli に関する私の知識は、このアプローチの結果を完全に理解するにはあまりにも限られています。Mysqli が接続を一緒にプールすることをどこかで読んだので、スクリプトが関数を初めて実行して、一連の資格情報を使用して server_A にログインし、しばらくして同じスクリプトで再度実行しようとすると、そうではありません実際には新しい接続を作成しますが、同じ接続を使用します。私は正しいですか、それとも物事を混同していますか?

どのような種類のデータについてどのサーバーに連絡する必要があるかを「動的に」伝えるという私のニーズに対処する最良の方法は何だと思いますか? それとも、他に良いアイデアがありますか?

4

1 に答える 1