PDO是否应准备使用之后的语句被释放?如果是这样,怎么样?具体而言,我正在询问关于MySQL的内容 - 你应该怎样,并且应该通过PDO调用DEALLOCATE PREPARE
。 (编辑:为了澄清,这个问题是不是指模拟准备,但真正的准备。)腾出PDO预处理语句(DEALLOCATE PREPARE)
而且 - 将这个免费(大时)设置的结果吗?
说明:
我已经沿着
$stmnt = $db->prepare($sql);
$stmnt->execute($aParams);
$stmnt = null;
这使我想知道这是什么一样,何时,如果f unset($stmnt);
将是不同的线条看到代码?
手动指示
当制备查询时,数据库将分析,编译和 优化其计划用于执行所述查询。 [...]通过使用准备好的 声明,应用程序避免重复分析/编译/优化循环。
它倾向于暗示你应该不分配语句,并且MySQL有能力。所以,
- 你能打电话
DEALLOCATE PREPARE
,以及如何 - 你应该这样做?
- 而且任何人都可以证实,设置声明为null(或注销的语句)会做一样的“free_result”为mysql_和mysqli_?
- 它立即发生,还是等垃圾收集器踢?
对于完整性,另一SO question提到“free_result”和mysqli_()
“关闭”功能表明,释放的声明实际上增加了时间(除非你有大量的内存使用情况和需要的空间)。但是“free_result”与释放SQL服务器使缓存准备好的语句不同。
你是否特意关闭模拟准备?默认情况下,准备好的语句在驱动程序中进行模拟,并在请求结束时释放(当所有内容都是GCd时)。无论如何故意放开它们的意义何在?通过在可能的情况下重新使用预先准备好的语句来提高性能。为了解决第3点,当语句被销毁时调用[free_result](http://lxr.php.net/xref/PHP_5_4/ext/pdo_mysql/mysql_statement.c#55)(未设置,请求结束等)没有测试,我相信立即调用dtors。 – Leigh
是的,我不是在模仿准备 - 抱歉,应该在问题中明确表达(但否则问题是毫无意义的)。为什么释放他们?因为有几个单独调用的语句不再用于该连接 - 所以它们也可以被释放(优化不被缓存)。那些被重复使用的东西我会坚持(直到不再需要,那么同样的问题适用于如何释放它们)。 – Robbie