PHP Mysqli'动态地'说应该使用啥连接(变量)

Posted

技术标签:

【中文标题】PHP Mysqli\'动态地\'说应该使用啥连接(变量)【英文标题】:PHP Mysqli 'dynamically' saying what connection (variable) should be usedPHP Mysqli'动态地'说应该使用什么连接(变量) 【发布时间】:2013-08-09 04:33:12 【问题描述】:

使用多个(动态)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,并且稍后它会尝试在同一个脚本中再次执行此操作,它不会实际上创建了一个新连接,但使用了相同的连接。我是对的还是把事情搞混了?

您认为解决我的“动态”需求的最佳方式是什么?什么类型的数据应该联系哪个服务器?或者你还有什么好主意?

【问题讨论】:

理想情况下,您的数据库扩展问题仍然是系统问题,不涉及任何编码。如果您可以选择查看 Amazon 的 RDS 之类的东西,以将您的可扩展性转移回系统管理员的关注点。还要重新考虑是否所有数据都需要在关系数据库中。也许 CouchDB 或 Mongo 可以更好地扩展日志之类的东西。 【参考方案1】:

你可以使用像http://php.net/manual/en/book.mysqlnd-ms.php这样的工具

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

【讨论】:

以上是关于PHP Mysqli'动态地'说应该使用啥连接(变量)的主要内容,如果未能解决你的问题,请参考以下文章

PHP 使用 Mysqli 的 prepare 语句有啥好处?

phpmyadmin 使用 mysqli 连接,但我的 php 使用 mysqli 出错了

多个php版本,无法连接mysqli [重复]

php 通过mysqli 操作数据库mysql

PHP mysqli - 从准备好的语句返回关联数组

PHP中的MySQLi扩展学习MySQLi介绍