PDO准备的语句在使用后是否应该释放?如果是,怎么做?具体来说,我问的是MySQL——你怎么能,也应该通过PDO调用DEALLOCATE PREPARE
。(编辑:为了澄清,这个问题不是指模拟的准备,而是指真实的准备。)
此外,这会释放结果集吗(当大的时候)?
说明:
我看到了沿线的代码
$stmnt = $db->prepare($sql);
$stmnt->execute($aParams);
$stmnt = null;
这让我想知道这是什么,什么时候,如果funset($stmnt);
会不同?
手册指出
当准备好查询时,数据库将分析、编译和优化其执行查询的计划。[…]通过使用语句,应用程序避免重复分析/编译/优化周期。
这倾向于建议您应该取消对语句的分配,MySQL具有此功能。所以,
- 你能打电话给
DEALLOCATE PREPARE
吗 - 你应该这么做吗
- 有人能确认将语句设置为null(或取消设置语句)对mysql_和mysqli_的作用与"free_result"相同吗
- 它是立即发生,还是等待垃圾收集器启动
为了完整性,另一个涉及mysqli_()
的"free_result"one_answers"close"函数的SO问题表明,释放语句实际上会增加时间(除非您使用了大量内存并需要空间)。但是"free_result"不同于将SQL服务器从缓存已准备好的语句中释放出来。
PDO准备的语句在使用后是否应该释放?如果是,怎么做?
在MySQL的上下文中?不。为什么?
默认情况下,PDO模拟准备好的语句。这意味着PDO本身进行参数替换、转义等,并向下发送SQL块,而不是使用本机准备的语句。
虽然您可以打开它,但您仍然不需要明确地关闭句柄,除非您也在使用无缓冲查询。仅仅让语句句柄超出范围或将其设置为null将不会关闭光标。同样,如果您使用的是无缓冲的查询,则此仅很重要。如果不是,那么让它超出范围或将其设置为null就足以干净地关闭句柄。
您还链接到了DEALLOCATE PREPARE
。当使用SQL字符串手动调用PREPARE
时,仅需要该语法。与PDO_MYSQL
所使用的基于MySQL C级API的准备语句相比,这是一个完全独立的操作。(好吧,也许你使用的是mysqlnd
,但实际上是一样的。)
是。完成prepare语句后,可以将其设置为NULL
或使用unset()
。
对于具有多个查询和大型数据库的脚本来说,这是有区别的。您可以使用进行测试
$before = memory_get_usage();
$stmt = NULL;
die(memory_get_usage() - $before);
对我来说,这节省了20MB的内存,后来导致脚本崩溃。