1

这个 PHP 文档中,它给出了如何关闭连接的以下示例:

$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;
}
4

5 回答 5

3

根据文档:

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

所以连接不会在函数结束时关闭,因为你没有分配null。虽然它是不可访问的,因为它的作用域是函数本地的,但从技术上讲,它直到脚本结束才会关闭。

注意:一般来说,我不建议在函数调用中建立和关闭数据库连接。

于 2013-07-29T13:26:26.023 回答
1

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

在您的情况下,您没有使用连接进行查询,并且当方法结束时,连接将关闭。

于 2013-07-29T13:26:51.790 回答
1

严格来说,设置$dbh为 null 不会关闭连接。这将使 PDO 实例有资格进行垃圾回收(只要没有对该对象的任何其他引用)。大概 PDO 的析构函数会清理连接。

要回答您的问题,您的示例将关闭连接(或至少以与第一个示例相同的方式操作),因为再次$dbh有资格进行垃圾收集。

于 2013-07-29T13:27:08.120 回答
0

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

function close_connection(PDO $dbh) {
   $dbh = null;
}
于 2013-07-29T13:26:44.727 回答
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;
于 2013-07-29T13:32:48.113 回答