PHP Mysqli';动态地';说明应该使用什么连接(变量)


PHP Mysqli 'dynamically' saying what connection (variable) should be used

使用多个(动态)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,并且几分钟后它试图在同一脚本中再次这样做,它实际上并没有创建新的连接,而是使用同一个连接。我是对的还是把事情搞混了?

你认为什么是解决我的"动态"需求的最佳方法,即应该联系什么服务器来获取什么类型的数据?或者你还有其他好主意吗?

您可以使用以下工具http://php.net/manual/en/book.mysqlnd-ms.php

这允许主人和阅读奴隶。另一种选择是像另一个答案所建议的那样,看看类似亚马逊RDS的东西。