複数の (動的) 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 にログインし、しばらくして同じスクリプトで再度実行しようとすると、そうではありません実際には新しい接続を作成しますが、同じ接続を使用します。私は正しいですか、それとも物事を混同していますか?
どのような種類のデータについてどのサーバーに連絡する必要があるかを「動的に」伝えるという私のニーズに対処する最良の方法は何だと思いますか? それとも、他に良いアイデアがありますか?