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