Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么更有效?为什么:每页一个db连接,还是每个函数一个db连接?_Php_Mysql_Performance_Mysqli - Fatal编程技术网

Php 什么更有效?为什么:每页一个db连接,还是每个函数一个db连接?

Php 什么更有效?为什么:每页一个db连接,还是每个函数一个db连接?,php,mysql,performance,mysqli,Php,Mysql,Performance,Mysqli,我在一个非常MySQL数据库驱动的网站上工作。所以我有很多疑问 在中,everyone建议连接到页面顶部的DB,并在页面底部断开连接 我想知道什么更有效,或者说一般来说是最佳做法:每页建立一个db连接,或者只根据需要进行连接?(或者没有一般性的答案,这取决于具体情况?) 此外,我还想了解为什么这是最佳实践,您从哪个角度来看这个场景(例如,安全性、速度……我不知道DB连接可能会影响什么?!) 我相信这个问题以前有人问过——但不是针对PHP的,因此我觉得它没有什么帮助 我目前的做法是为我编写的每个函

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

在中,everyone建议连接到页面顶部的DB,并在页面底部断开连接

我想知道什么更有效,或者说一般来说是最佳做法:每页建立一个db连接,或者只根据需要进行连接?(或者没有一般性的答案,这取决于具体情况?)

此外,我还想了解为什么这是最佳实践,您从哪个角度来看这个场景(例如,安全性、速度……我不知道DB连接可能会影响什么?!)

我相信这个问题以前有人问过——但不是针对PHP的,因此我觉得它没有什么帮助

我目前的做法是为我编写的每个函数连接到每个mysqli的DB,并在函数结束时断开连接,因为我觉得它更干净。这样,如果页面不调用需要DB访问的函数,则永远不会打开连接。但是,根据用户在站点上的操作,每个页面加载最多可能有10个连接。现在我想这可能是资源的公平分配。如果我理解正确,则始终只能打开1 DB连接。因此,我假设所有连接请求都将排队。因此,如果一个用户有多个长而复杂的查询,那么这个用户不会占用所有的流量,因为在每个查询之间,其他短查询都可以得到处理。但那只是我编造的,我不知道这样是否真的有效…:D

我也知道这里的很多开发人员都喜欢使用PDO。当我开始开发时,我选择使用mysqli,并且我没有切换的计划。我希望我的问题能适用于这两个图书馆


谢谢:-)

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

例如,PDO允许创建持久连接,这可能会提高性能,因为该连接将被重用以服务一行中的多个请求。发件人:

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

每页一个db连接还是每个函数一个db连接

每页一张

为什么这是最佳实践

速度和常识

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

错。只能在DB侧设置限制。总有一个游泳池

每页建立一个db连接,还是仅根据需要进行连接


是什么阻止您只在需要时连接一次?如果没有打开的连接,则使db函数自动连接,如果存在,则重新使用它。虽然我觉得它不是“MySQL DB驱动的”站点,但我建议你考虑使用连接工厂模式。这将允许您仅在需要它的函数中调用工厂(如果不需要连接,则避免连接开销),同时允许您在以前建立连接的情况下重用连接(避免重复构造和解构连接的开销)

您的页面中可能包含一个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说:“打开的连接(和类似的资源)在脚本执行结束时会自动销毁。”

因此,您不必显式地关闭连接。然而,出于性能原因,有时可能需要这样做。这将取决于您正在运行的上下文,并且您必须在查看上下文时平衡这一点

你也可以看看类似的例子


注意:我没有测试过这段代码,它可能是一个工作示例

你说“创建数据库连接很昂贵”。。。我会把你的陈述当作一个真实的事实,并将开始每页只打开一个连接。。。如果您能提供一些额外的信息,说明是什么让它变得“昂贵”,您可以将其作为一个单独的问题来提问,以获得更多人的意见。数据库会话是复杂的事情:在客户机上有网络连接、SQL解析器状态,在服务器上有各种各样的缓冲区。它们都必须为每个会话创建和初始化,并在会话结束后释放。所有这些都需要花费大量的时间,尽管对于某些数据库来说显然要比其他数据库花费更多的时间。