【问题标题】:Does duplicating the PDO object create multiple connections?复制 PDO 对象会创建多个连接吗?
【发布时间】:2013-05-29 14:26:28
【问题描述】:

我有一个关于使用 PDO 的问题,但我无法找到答案。这对于 mysql/mysqli 连接可能也同样适用。

在我的项目的主要包含中,我使用创建一个 PDO 对象

$pdo = new PDO('connection here');

嗯,我有一个需要访问数据库的类。因此,不要使用“global $pdo;”在每个函数内部,我做了以下操作。

class MyClass(){
    private $db = null;
    __construct(){
        global $pdo;
        $this->db = $pdo;
    }
    function example(){
        $sql = 'A Query';
        $this->db->prepare($sql);
    }
 }

无论如何,我的问题是,这样做是否会创建 2 个到数据库的连接,因为我通过将类的 $db var 设置为等于它来有效地复制 $pdo?我问的主要原因是因为我在我们的系统中经常看到这种情况,并且担心创建太多与 MySQL 的连接并由于不必要的连接而导致系统崩溃。

作为第二部分,以下是否会导致重复,我可以通过 ref 吗?我有点害怕尝试它并导致损坏。

改变

function MyFunction($member_id, $pdo){
    //do something.
}

function MyFunction($member_id, &$pdo){
   //do something
}

谢谢!

【问题讨论】:

  • 刚刚回答了这个问题:PHP Object Assignment vs Cloning。答案应该可以消除您的困惑。
  • 这是同一个对象,因为对象总是与引用一起存储
  • 附带说明,从老派 mysql_connect() 返回的连接是否符合这些规则?
  • @GameCharmer 返回一个叫做“资源”的东西,这是另一种奇怪的变量;然而,和对象一样,变量的“值”只是资源的 ID,因此赋值的工作方式与对象类似。

标签: php mysql pdo


【解决方案1】:

正如 cmets 中的 deceze 所提到的,您实际上并没有在此代码中复制 PDO 对象,您只是分配了一个额外的变量来引用同一个对象。

This answer 详细解释,但总而言之,对象具有额外的间接级别 - 即使您不通过引用传递,您仍然只是将 指针 复制到对象,不是对象本身。

仅当您确实想要修改变量并让修改传播回来时,才需要通过引用传递;将一个全新的对象分配给函数内部的$pdo 将被视为修改变量,但不会操作该对象。

与直觉相反,通过引用分配通常更差性能,因为它破坏了 PHP 引擎中的“写入时复制”优化,该优化允许具有相同值的不同变量共享相同的内存。

【讨论】:

    【解决方案2】:

    它不会创建两个连接。要确认您可以使用: xdebug_debug_zval。查看 php 手册以了解使用情况。 您可以使用以下代码的帮助检查结果: xdebug_debug_zval('pdo');和 xdebug_debug_zval('db');

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      相关资源
      最近更新 更多