63

当我只使用 PHP 的内置 MySQL 函数在 PHP 中打开 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

我是否必须像使用mysql_connect()and一样明确关闭连接mysql_close()?如果没有,PHP 如何知道我的连接何时完成?

TIA。

4

6 回答 6

78

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

PHP:PDO 连接和连接管理

成功连接到数据库后,PDO 类的实例将返回到您的脚本。该连接在该 PDO 对象的生命周期内保持活动状态。要关闭连接,您需要通过确保删除对它的所有剩余引用来销毁该对象——您通过将 NULL 分配给保存该对象的变量来做到这一点。如果您没有明确地这样做,PHP 将在您的脚本结束时自动关闭连接。

于 2009-06-25T23:01:33.983 回答
13

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文档:

相关的 Stackoverflow 问题:

于 2013-01-01T18:34:38.493 回答
11

PHP 脚本执行完毕后,所有连接都将关闭。此外,您不必明确关闭与mysql_close().

于 2009-06-25T23:01:56.603 回答
5

您还可以将连接限制在本地函数内。这样,一旦功能完成,连接就会关闭。

于 2010-10-28T12:57:16.933 回答
1

好吧,当$link为 PDO 分配了一个对象时,PHP 会在脚本运行时将其设置为 null,这样它就不再是一个对象。因此你可以这样做:

$link = new PDO("mysql:dbname=$dbname;host=$servername",$username,$password);

//prepare statements, perform queries

$link = null;
于 2013-07-04T21:17:36.160 回答
0

http://uk3.php.net/pdo

从我收集的信息来看,无论如何我都看不到在 php 手册中关闭它,而且我快速查看的脚本示例从我所看到的无论如何都没有关闭连接。

于 2009-06-25T23:03:24.273 回答