PDO MySQL连接关闭- unset vs null


PDO MySQL Connection close - unset vs null

我在PDO手册中读到要关闭连接,您应该使用以下命令:

$connection = null;

然而,有些人建议,由于PHP 5.3有一个新的GC,应该使用以下代码:

unset($connection);

我需要一劳永逸地知道,哪一个是首选,还是它们是相同的?

它们做同样的事情。取消$pdo句柄设置和将其设置为null都会关闭连接。

你可以自己测试一下。在一个窗口中运行以下脚本,在另一个窗口中打开MySQL客户端,每隔几秒钟运行SHOW PROCESSLIST,看看连接何时消失。

<?php
$pdo = new PDO(..);
sleep(10);
unset($pdo);
echo "pdo unset!'n";
sleep(10);

unset($pdo)改为$pdo=null;,重新运行测试。

<?php
$pdo = new PDO(..);
sleep(10);
$pdo = null;
echo "pdo set null!'n";
sleep(10);

末尾额外的sleep()是为了让您在PHP脚本终止(无论如何都会断开连接)之前有时间查看连接是否已断开。

我被这个绊倒了。我有一个跨越设置和拆除的PDO对象,我找不到必须有剩余引用的地方,因为将$ PDO设置为null并没有解决问题。

http://php.net/manual/en/pdo.connections.php中的用户贡献笔记讨论了延迟关闭的问题。这里他们建议终止当前连接:

pdo ->查询("选择pg_terminate_backend (pg_backend_pid ()); ');$p = null;

这是用于postgres的。对于mysql,我使用:

pdo ->查询("杀死连接CONNECTION_ID();");

using

$pdo = null; //is an assignment to null; the variable still declared in the memory.

,

unset($pdo); // will call the function to distroy also the adress "@" pointed by the variable.

完全不用关闭。PHP会为你关闭它。

请注意,您的应用程序当然必须经过合理的设计,而不需要以机关枪的速度重新连接到不同的数据库。即使在后一种情况下,您用于关闭的方法也是最小的问题。你叫错树了。注意连接的数量,而不是关闭它们的方式。