PDO准备好的陈述应该在使用后释放吗?如果是这样,怎么样?具体来说,我问的是MySQL - 你怎么能,也应该通过PDO调用DEALLOCATE PREPARE
。 (编辑:澄清一下,这个问题不是指仿效准备,而是真正的准备。)
此外 - 这会释放结果集(大时)吗?
说明:
我已经看到了
的代码$stmnt = $db->prepare($sql);
$stmnt->execute($aParams);
$stmnt = null;
这让我想知道这是做什么的,什么时候,如果f unset($stmnt);
会有所不同?
手册表明
准备好查询后,数据库将进行分析,编译和 优化其执行查询的计划。 [...]使用准备好的 声明应用程序避免重复 分析/编译/优化循环。
这往往暗示你应该取消分配语句,MySQL有能力。所以,
DEALLOCATE PREPARE
,以及如何致电为了完整性,另一个SO question引用mysqli_()
的“free_result”和“close”函数表明释放语句实际上增加了时间(除非你有大量的内存使用并需要空间)。但是“free_result”与释放SQL服务器与缓存准备好的语句不同。
答案 0 :(得分:4)
PDO准备好的陈述应该在使用后释放吗?如果是这样,怎么样?
在MySQL的背景下?不,为什么?
PDO emulates prepared statements by default。这意味着PDO本身会执行参数替换,转义等操作,并在行中发送SQL块,而不是使用 native 预处理语句。
虽然您可以打开它,但您仍然不需要明确地关闭句柄,除非您还在使用unbuffered queries。仅仅让语句句柄超出范围或将其设置为null将不关闭光标。同样,如果您使用的是无缓冲的查询,则此仅很重要。如果不是,那么让它超出范围或将其设置为null就足以干净地关闭句柄。
您还链接到DEALLOCATE PREPARE
。当手动使用SQL字符串调用PREPARE
时,该语法仅 。这是MySQL C-level API-based prepared statements完全独立的行动,PDO_MYSQL
正在使用mysqlnd
。 (好吧,也许你正在使用{{1}},但它实际上是相同的。)
答案 1 :(得分:1)
是。完成准备语句后,您可以将其设置为NULL
或使用unset()
。
对于具有多个查询和大型数据库的脚本,这会产生影响。您可以使用以下方式进行测试:
$before = memory_get_usage();
$stmt = NULL;
die(memory_get_usage() - $before);
对我来说,这节省了20MB的内存,后来崩溃了。