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

Rob*_*bie 11 php mysql pdo prepared-statement

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

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

说明:

我已经看到了代码

$stmnt = $db->prepare($sql);
$stmnt->execute($aParams);
$stmnt = null;
Run Code Online (Sandbox Code Playgroud)

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

手册表明

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

这往往表明你应该取消分配语句,MySQL有能力.所以,

  1. 你可以打电话DEALLOCATE PREPARE,怎么打电话
  2. 你应该这样做吗?
  3. 并且任何人都可以确认设置语句为null(或取消设置语句)将与mysql_和mysqli_的"free_result"相同吗?
  4. 它会立即发生,还是等待垃圾收集器启动?

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

Cha*_*les 4

PDO 准备好的语句在使用后是否应该释放?如果是这样,怎么办?

在 MySQL 的背景下?没有为什么?

默认情况下, PDO模拟准备好的语句。这意味着 PDO 本身会执行参数替换、转义等操作,并向下发送 SQL 块,而不是使用本机准备好的语句。

虽然您可以打开它,但您仍然不需要明确关闭句柄,除非您还使用无缓冲查询。仅让语句句柄超出范围或将其设置为 null 不会关闭游标。同样,这在您使用无缓冲查询时才重要。如果不是,那么让它超出范围或将其设置为 null 就足以彻底关闭句柄。

您还链接到DEALLOCATE PREPARE. 当使用 SQL 字符串手动调用时才需要该语法。这是一个与正在使用的MySQL C-level API-based prepared statementsPREPARE完全独立的操作。(好吧,也许你正在使用,但它实际上是同一件事。)PDO_MYSQLmysqlnd

  • 不需要吃帽子 - 我刚刚检查了日志,它与你所描述的完全一样。PREPARE 不会出现,但对prepare() 的调用会出现 - 适合您链接的C 级API。并且 mysql_stmt_close(stmt)) 似乎也被立即调用,大概是在 PHP 中将 stmnt 设置为“null”时(显然有限的测试,但“stmt close”总是在日志中跟随)。感谢您的指点 - 我会放心我做对了。 (3认同)