【发布时间】:2011-10-27 10:25:06
【问题描述】:
我正在使用 PDO 在 PHP 中访问两个 SQLite 3 数据库。我想在查询期间通过重命名它们来切换数据库文件,但是当文件打开时我不能这样做,因为它会给出一个错误,即该文件正在被另一个进程使用。我尝试关闭持久连接并将句柄设置为空,但都不起作用。
真的没有办法关闭一个 PDO 句柄并释放对数据库文件的锁定吗?
【问题讨论】:
我正在使用 PDO 在 PHP 中访问两个 SQLite 3 数据库。我想在查询期间通过重命名它们来切换数据库文件,但是当文件打开时我不能这样做,因为它会给出一个错误,即该文件正在被另一个进程使用。我尝试关闭持久连接并将句柄设置为空,但都不起作用。
真的没有办法关闭一个 PDO 句柄并释放对数据库文件的锁定吗?
【问题讨论】:
我相信unset($var) 会这样做,我在我的 pdo sqlite 项目中使用它,它的工作方式就像我想要的那样:)
【讨论】:
将所有对句柄的引用设置为null(或除 PDO 对象之外的任何对象,真的),运行时将破坏该对象,从而关闭连接。
$db = new PDO('...');
// Do some stuff
$db = null;
// Assuming this was the last reference to that PDO
// object, the runtime will destroy the object and
// its connection.
【讨论】:
unset() 他们,因为 PHP$var = NULL 操作方面有点善变,不会破坏资源直到感觉像这样(尝试在 5.2.x 上使用 fsockopen() 资源并打开 Wireshark 进行此操作,您会看到 Zend 唤醒并发送 RST 数据包需要 5-10 秒,除非脚本结束)。出于某种原因,未设置没有这个问题。