Php 数据库连接的延迟连接应该是这样的吗?

Php 数据库连接的延迟连接应该是这样的吗?,php,pdo,lazy-loading,Php,Pdo,Lazy Loading,所以我研究了在OOP中连接数据库的好方法。如果查看我的数据库模型中的connect()方法,我仅在即将查询时进行连接,如果还没有连接,则进行连接。我想这叫做“懒散的连接”,我在一次偶然的机会中发现了它 它不是意味着只为整个应用程序建立1数据库连接吗 如果我在文件A中创建了newdatabase(),在文件B中创建了newdatabase(),那么仍然会有两个连接 如果有什么帮助的话,我正在使用微MVC框架 class Database { private $pdo; privat

所以我研究了在OOP中连接数据库的好方法。如果查看我的数据库模型中的
connect()
方法,我仅在即将查询时进行连接,如果还没有连接,则进行连接。我想这叫做“懒散的连接”,我在一次偶然的机会中发现了它

它不是意味着只为整个应用程序建立1数据库连接吗

如果我在文件A中创建了
newdatabase()
,在文件B中创建了
newdatabase()
,那么仍然会有两个连接

如果有什么帮助的话,我正在使用微MVC框架

class Database
{
    private $pdo;
    private $host;
    private $databse;
    private $username;
    private $password;

    public function __construct()
    {
        $this->host     = Config::get('mysql/host');
        $this->database = Config::get('mysql/database');
        $this->username = Config::get('mysql/username');
        $this->password = Config::get('mysql/password');
    }

    public function query($sql, $params)
    {
        $this->connect();

        $sth    = $this->pdo->prepare($sql);
        $params = is_array($params) ? $params : [$params];

        if ($sth->execute($params)) {
            return $sth->fetch(PDO::FETCH_OBJ);
        }
    }

    private function connect()
    {
        if (!$this->pdo) {
            try {
                $this->pdo = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->database . ';charset=utf8', $this->username, $this->password);
            } catch (Exception $e) {
                die($e->getMessage());
            }
        }
    }
}

如果将new Database()的结果存储在全局变量中,则可以重用该变量,并为整个应用程序建立一个连接

如果在文件A中执行new Database(),在文件B中执行new Database(),则将有两个连接,这是正确的


您的代码的总体概念与我使用的代码类似,并且运行良好。

要使一个类只有一个实例,您需要singleton模式


不过,你可以很容易地将此添加到现有的类中。

我很乐意对上述答案进行评论,但声誉让我无法这样做。然而,我必须确保人们不会阅读这些内容,并相信这是正确的或好的做法

关于主题: 一个数据库连接的想法是好的,直到它不是。你可能不得不连接到第二个,然后一个单身汉会阻止你这么做。 还应使用实际参数进行配置:

  • 您希望能够建立多个连接,但无法,因为类
    Config
    不允许这样做
  • 该类与
    Config
    类硬耦合
  • 需要在代码周围浮动神奇的字符串,比如
    'mysql/host'
    ,也不是一个好主意。有人可能会出现,并喜欢在配置中使用不同的名称。如果只使用参数进行配置,则问题将消失
  • 您希望能够清楚地看到类所具有的依赖关系。隐藏它需要
    Config
    和4个参数这一事实只会迫使您在每次使用它时查看实现
  • 关于在会话中存储连接:

  • 重点是什么?您无法为另一个PHP运行保护它
  • 它的序列化是不可能的,因为它是一种资源
  • 如上所述:如果在全局使用对象时将对象存储在会话中,则可能会隐藏依赖项

  • 希望对这件事有所了解还不算太晚。您正在混合两个概念-1。延迟加载(在本例中为延迟连接)和2。持久连接

    只有在进行查询时,发布的代码才能正确地建立实际的数据库连接。代码的正确性取决于代码的使用方式。考虑下面的伪调用:

  • 实例化调用构造函数的数据库类
  • 显式调用connect函数
  • 询问
  • 上面的序列抵消了延迟连接的好处,因为不管怎样都会建立连接。但是,如果删除步骤2,查询函数将调用connect,这将创建到数据库的真正连接

    这为什么有用?在复杂的项目中,连接处理程序通常包含在某些头文件中。数据库查询是在各种组件中进行的。在进行查询时,必须准备好数据库连接。因此,即使在不从数据库加载任何内容的页面上也会创建连接。请记住,TCP连接是宝贵的服务器资源。建立太多未使用的连接只是浪费。惰性连接方法正好解决了这个问题

    持久连接是一个不同的概念。这意味着在页面会话结束时,连接没有关闭。当需要一个新的连接时,PHP会寻找一个“相同”的连接来重用


    为了完整起见,我想指出,持久连接也不同于连接池,尽管可以将持久连接视为1的连接池。

    我知道singleton。静态类是很难测试的,我读到过惰性连接是首选的。()是否应该将此移到?以回应您的回答(和否决票)**单个db连接非常有用。当需要第二个连接时,OP自然会发现通过
    Config
    类传递数据库连接信息需要调整。在我看来,这不是问题的主要焦点**为什么要将连接存储在会话变量中?同意需要在每次页面加载时重新建立连接,并使用一个全局变量。对我来说,使用类似于
    $\u SESSION['db']
    的东西存储全局变量非常方便,也更易于维护。我不同意这种观点,因为资源和对象在代码中有一条清晰的路径,这一事实带来了巨大的可维护性。使用像$\u SESSION这样的变量意味着您的代码中有一个不明显的需求。由于对$\u会话的依赖性,代码不可重用。如果要在没有上下文的上下文中运行代码,该怎么办?我确实明白了这一点:“当你到达桥的时候就过桥”。然而,你甚至不需要再构建它了,因为有很好的框架可以让这变得更容易,你可以专注于重要的业务代码。我已经删除了$\u SESSION作为全局变量示例的引用。除此之外,并非所有人都选择框架作为解决方案。对于大多数应用程序,我支持在一个简单的全局变量中重用连接的有用性。感谢您对编码方法的反馈。