关闭函数内部的PDO连接

时间:2013-07-29 13:22:17

标签: php mysql pdo

this PHP documentation中,它给出了以下关于如何关闭连接的示例:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// use the connection here


// and now we're done; close it
$dbh = null;

但是如果我在$dbh只有本地范围的函数中使用它,我是否必须将其设置为null,或者当函数返回时连接是否会关闭?

在我的下面示例中,连接是否已关闭?

public function doDBWork(){
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    // use the connection here

    return true;
}

5 个答案:

答案 0 :(得分:3)

根据文件:

  

通过将NULL分配给保存对象的变量来[关闭连接]。如果您没有明确地执行此操作,PHP将在脚本结束时自动关闭连接。

因此,由于您未指定null,因此不会在函数末尾关闭连接。虽然它是不可访问的,因为它的范围是函数的本地范围,但在技术上它不会在脚本结束之前关闭

注意:通常,我不建议在函数调用中建立和关闭数据库连接。

答案 1 :(得分:1)

PHP PDO为您管理连接。您可以确保将关闭连接设置为PDO连接对象的null。但没有必要。

在这种情况下,您没有使用连接来进行查询,当方法结束时,连接将被关闭。

答案 2 :(得分:1)

严格地说,将$dbh设置为null不会关闭连接。这将使PDO实例符合垃圾收集条件(只要没有对该对象的任何其他引用)。据推测,PDO的析构函数可以清除连接。

要回答您的问题,您的示例将关闭连接(或至少以与第一个示例相同的方式执行),因为$dbh将再次符合垃圾回收条件。

答案 3 :(得分:0)

您可以将DB句柄作为参数传递给全局函数(或静态方法)。但这真的没必要。代码执行结束时,DB句柄自动关闭。无需明确关闭它。

function close_connection(PDO $dbh) {
   $dbh = null;
}

答案 4 :(得分:0)

更好的方法可能是依赖注入,这样您就不必打开多个连接。

class MyClass {
    protected $PDO;

    public function __construct(PDO $PDO) {
        $this->PDO = $PDO;
    }

    public function DoDbWork() {
        $this->PDO->Query(); //uses same PDO instance that was supplied outside class
    }
}

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

//call multiple functions, do stuff procedurely, etc.
$t = new MyClass($dbh);
$t->DoDbWork();

$dbh = null;