释放PDO预处理语句(DEALLOCATE PREPARE)

时间:2012-11-26 05:42:17

标签: php mysql pdo prepared-statement

PDO准备好的陈述应该在使用后释放吗?如果是这样,怎么样?具体来说,我问的是MySQL - 你怎么能,也应该通过PDO调用DEALLOCATE PREPARE。 (编辑:澄清一下,这个问题不是指仿效准备,而是真正的准备。)

此外 - 这会释放结果集(大时)吗?

说明:

我已经看到了

的代码
$stmnt = $db->prepare($sql);
$stmnt->execute($aParams);
$stmnt = null;

这让我想知道这是做什么的,什么时候,如果f unset($stmnt);会有所不同?

手册表明

  

准备好查询后,数据库将进行分析,编译和   优化其执行查询的计划。 [...]使用准备好的   声明应用程序避免重复   分析/编译/优化循环。

这往往暗示你应该取消分配语句,MySQL有能力。所以,

  1. 您可以致电DEALLOCATE PREPARE,以及如何致电
  2. 你应该这样做吗?
  3. 任何人都可以确认设置语句为null(或取消设置语句)将与mysql_和mysqli的“free_result”相同_?
  4. 是立即发生,还是等待垃圾收集器启动?

  5. 为了完整性,另一个SO question引用mysqli_()的“free_result”和“close”函数表明释放语句实际上增加了时间(除非你有大量的内存使用并需要空间)。但是“free_result”与释放SQL服务器与缓存准备好的语句不同。

2 个答案:

答案 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的内存,后来崩溃了。