PHP Mysqli 'dynamically' 说明应该使用什么连接(变量)

标签 php mysql mysqli database-connection

使用多个(动态)PHP Mysqli 连接的最佳方式是什么?

目前我只有一个 MySQL 服务器。我所有的数据都在这台服务器上的几个数据库中。但在不久的将来,我的存储需求将超过这台服务器的处理能力。所以我可能需要做的是将一些数据库放在一台服务器上,另一些放在另一台服务器上。在更远的将来,可能会有更多的服务器发挥作用。

为了“ future 证明”我的脚本,我认为指向正确服务器的类可能是最佳解决方案。我只是发送一个我想要获取的数据的“ key ”,它说明我应该使用什么连接,因为它存储在该服务器上。例如,如果我想获取一些日志,我会发送键“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 这样的工具

允许主控和读取从属。另一种选择是像其他答案建议的那样查看 amazon RDS 之类的东西。

关于PHP Mysqli 'dynamically' 说明应该使用什么连接(变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18109487/

相关文章:

除非您转到脚本所在的文件夹,否则 PHP 命令不起作用

javascript - 使用 Laravel 的 Ajax Post 错误 422

php - 将来自 mySQL 的 PDO 请求输出到下拉选择器列表中

mysql - 如何让emysql返回utf-8编码的二进制文件

php - mysqli::query(): 无法获取 mysqli

php - 为什么电子邮件值在 mysql 数据库中存储为 %email ?

php - 在php中格式化日期

sql - SQL 的内置多线程功能是否令人满意?

php - 如何将任意数量的值绑定(bind)到 mysqli 中的准备语句?

php - 本地测试服务器不工作 Dreamweaver CS6