6

我正在一个非常 MySQL DB 驱动的网站上工作。所以我有很多疑问。

本主题中,每个人都建议在页面顶部连接到数据库,并在页面底部断开连接。

我想知道什么更有效,或者一般来说是最佳实践:每页建立一个数据库连接,还是只根据需要连接?(或者没有普遍的答案,这取决于?)

此外,我正在寻找为什么这是最佳实践,您从哪个角度看待场景(例如安全性,速度,......我不知道数据库连接可能会影响什么?!)

我相信这个问题在此之前已经被问过- 但不是针对 PHP,因此我觉得它没有帮助。

我目前的做法是通过mysqli连接到数据库对于我编写的每个函数,并在函数末尾断开连接,因为它对我来说似乎更干净。这样,如果页面不调用需要数据库访问的函数,则永远不会打开连接。但是,根据用户在网站上的操作,每个页面加载可能最多有大约 10 个连接。现在我认为这可能是资源的公平分配。如果我理解正确,则只能始终打开 1 个 DB 连接。因此,我假设所有连接请求都将排队。因此,如果用户有多个、长且复杂的查询,则该用户不会阻塞所有流量,因为在每个查询之间,可能会处理其他短查询。但这只是我在编造东西,我不知道它是否真的会那样工作......:D

我也知道这里的很多开发人员都喜欢使用PDO。刚开始开发的时候选择使用mysqli,暂时没有切换的打算。我希望我的问题适用于这两个图书馆。

谢谢 :-)

4

3 回答 3

8

通常,创建数据库连接的成本很高。这就是为什么大多数人建议创建一次连接并重复使用它直到执行停止,或者如果数据库客户端库允许,甚至更长时间。

例如,PDO 允许创建持久连接,这可能会提高性能,因为该连接将被重复用于连续服务多个请求。从http://php.net/manual/en/pdo.connections.php

许多 Web 应用程序将受益于与数据库服务器建立持久连接。持久连接不会在脚本结束时关闭,但会在另一个脚本使用相同凭据请求连接时被缓存并重新使用。持久连接缓存允许您避免每次脚本需要与数据库通信时建立新连接的开销,从而提高 Web 应用程序的速度。

于 2013-03-25T18:29:10.403 回答
5

我建议您考虑使用连接工厂模式。这将允许您仅在需要它的函数中调用工厂(如果从不需要连接,则避免连接的开销),同时允许您在以前建立连接时重用连接(避免重复构造和解构连接)。

也许你的页面中包含了一个 connectionFactory.php,或者可以通过你的加载器获得。

class ConnectionFactory{

private static $factory;
public static function getFactory(){
    if (!self::$factory){
        self::$factory = new ConnectionFactory();
        $this->db = null;
    }
    return self::$factory;
}

private $db;

public function getConnection(){
    if (is_null($this->db))
        $this->db = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
        if ($this->db->connect_error){
            throw new Exception("Connect Error ("
                . $this->db->connect_errno
                . ") "
                . $this->db->connect_error
        );
    }
    return $this->db;
}

public function closeConnection(){
   if (! is_null($this->db)){
       $this->db::close();
       $this->db = null;
   }
}

}

然后,您可以稍后在函数中使用它:

function doStuff(){
try{
    $conn = ConnectionFactory::getFactory()->getConnection();
}catch (Exception $e){

}

}

如果您根本不使用连接,这可以确保您永远不会产生开销,如果您这样做,则可以利用该连接。

devzone.zend.com 说:“打开的连接(和类似的资源)在脚本执行结束时会自动销毁。”

因此,您不必显式关闭连接。但是,出于性能原因,有时可能需要这样做。这将取决于您正在运行的上下文,当您查看上下文时,您必须自己平衡。

您可能还会查看类似的Global 或 Singleton 用于数据库连接?

注意:我没有测试过任何这段代码,它是一个可能工作的例子。;-)

于 2013-03-25T18:50:21.743 回答
2

每页一个数据库连接还是每个函数一个数据库连接?

每页一个

为什么这是最佳实践,

速度和常识

如果我理解正确,则只能始终打开 1 个 DB 连接。

错误的。唯一的限制可以在 DB 端设置。而且总是有一个游泳池。

每页建立一个数据库连接,还是只根据需要连接?

是什么阻止您连接一次但仅在需要时连接?如果没有打开的连接,则使您的 db 函数自动连接,如果存在则重用它。虽然我觉得“非常 MySQL DB 驱动”的网站不值得一团糟。

于 2013-03-25T18:31:18.497 回答