是否必须关闭在 PHP 中使用 PDO 打开的 SQL 连接

2022-08-30 09:21:58

当我在PHP中仅使用PHP的内置MySQL函数打开MySQL连接时,我会执行以下操作:

$link = mysql_connect($servername, $username, $password);
mysql_select_db($dbname);
//queries etcetera
mysql_close($link);

当我打开与PDO的连接时,它看起来像这样:

$link = new PDO("mysql:dbname=$dbname;host=$servername",$username,$password);
//prepare statements, perform queries

我是否必须像使用 和 那样显式关闭连接?如果没有,PHP如何知道我何时完成连接?mysql_connect()mysql_close()

腾讯网.


答案 1

用于让 PDO 知道它可以关闭连接。$link = null

PHP:PDO 连接和连接管理

成功连接到数据库后,PDO 类的实例将返回到脚本中。连接在该 PDO 对象的生存期内保持活动状态。若要关闭连接,需要通过确保删除对对象的所有剩余引用来销毁该对象 - 通过将 NULL 分配给保存该对象的变量来执行此操作。如果您没有明确执行此操作,PHP 将在脚本结束时自动关闭连接。


答案 2

PDO本身不提供这样的功能。通过 PDO 的连接通过 PHP 中的 PDO 对象引用间接管理。

但有时您无论如何都要关闭连接,而不管引用次数如何。要么是因为你无法控制它,要么是需要它进行测试或类似目的。

您可以通过运行 SQL 查询来关闭与 PDO 的 Mysql 连接。每个能够连接到Mysql服务器的用户至少能够拥有自己的线程:KILL

/*
 * Close Mysql Connection (PDO)
 */

$pdo_mysql_close = function (PDO $connection) {

    $query = 'SHOW PROCESSLIST -- ' . uniqid('pdo_mysql_close ', 1);
    $list  = $connection->query($query)->fetchAll(PDO::FETCH_ASSOC);
    foreach ($list as $thread) {
        if ($thread['Info'] === $query) {
            return $connection->query('KILL ' . $thread['Id']);
        }
    }
    return false;
};

$pdo_mysql_close($conn);

相关的 Mysql 文档:

相关的堆栈溢出问题:


推荐