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

ben*_*njy 62 php mysql sql pdo

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

$link = mysql_connect($servername, $username, $password);
mysql_select_db($dbname);
//queries etcetera
mysql_close($link);
Run Code Online (Sandbox Code Playgroud)

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

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

我必须明确地关闭连接像我做的mysql_connect()mysql_close()?如果没有,PHP如何知道我何时完成连接?

TIA.

Dre*_*awn 76

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

PHP:PDO连接和连接管理

成功连接到数据库后,将向您的脚本返回PDO类的实例.该连接在该PDO对象的生命周期内保持活动状态.要关闭连接,您需要通过确保删除对它的所有剩余引用来销毁对象 - 您可以通过为保存对象的变量赋值来执行此操作.如果您没有明确地执行此操作,PHP将在脚本结束时自动关闭连接.

  • 没有一个`unset()`PDO对象而不是将它设置为NULL?我真的想要澄清一下! (5认同)
  • 恕我直言,如果你unset()或设置为NULL没关系.AFAIK,以任何一种方式调用PDO :: __ destruct方法,就像让变量持续到脚本末尾并在该方法中关闭连接一样. (5认同)
  • 值得注意的是官方PHP手册(根据上面的链接)建议设置为null,并且不提"unset()".您是否在使用官方方法时遇到问题,或者您是否在学术上提问?如果是前者,请详细说明.如果是后者,您可能希望与PHP开发人员联系,他们最适合解决其官方记录的解决方案的替代方案.(例如,即使unset()在一个版本中工作,如果开发人员没有明确确保该方法,它也可能在另一个版本中不起作用.) (3认同)

hak*_*kre 13

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

但有时你想要关闭连接,无论引用计数如何.要么因为你无法控制它,需要它用于测试目的或类似.

您可以通过运行SQL查询来关闭与PDOMysql连接.每个能够连接到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);
Run Code Online (Sandbox Code Playgroud)

相关的Mysql文档:

相关的Stackoverflow问题:


Vex*_*tus 11

当PHP脚本完成执行时,所有连接都将关闭.此外,您不必明确关闭您的连接mysql_close().


JDe*_*age 5

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