php pdo 关闭,关于php:释放PDO准备好的语句(DEALLOCATE PREPARE)

使用后是否应释放PDO准备好的语句?如果是这样,怎么办?具体来说,我在问MySQL-您如何以及应该如何通过PDO调用DEALLOCATE PREPARE。 (编辑:为澄清起见,此问题不是指模拟准备,而是实际准备。)

另外-这样可以释放结果集(大时)吗?

说明:

我已经看到了类似的代码

$stmnt = $db->prepare($sql);

$stmnt->execute($aParams);

$stmnt = null;

这使我想知道这是什么功能,什么时候以及f unset($stmnt);是否会有所不同?

手册指出

When the query is prepared, the database will analyze, compile and

optimize its plan for executing the query. [...] By using a prepared

statement the application avoids repeating the

analyze/compile/optimize cycle.

这倾向于建议您取消分配该语句,而MySQL具有此功能。所以,

你可以打电话给DEALLOCATE PREPARE以及如何

你应该做吗?

谁能确认将mysql_和mysqli_的设置语句设置为null(或取消设置语句)是否与" free_result"相同?

它会立即发生,还是在等待垃圾收集器启动?

为了完整起见,另一个SO问题涉及mysqli_()的" free_result"和" close"函数,建议释放该语句实际上会增加时间(除非您占用大量内存并需要空间)。但是" free_result"与释放SQL Server缓存已准备好的语句不同。

您是否专门关闭了模拟准备? 默认情况下,准备好的语句在驱动程序中模拟,并在请求结束时释放(当所有内容均为GCd时)。 故意释放它们的意义何在? 通过在可能的情况下重新使用准备好的语句,可以提高性能。 要解决第3点,在销毁一条语句(未设置,请求结束等)时调用free_result-未经测试,我相信dtor会立即被调用。

是的,我没有模仿准备-抱歉,应该在问题中阐明这一点(但否则问题是没有意义的)。 为什么要释放它们? 因为有几个单独的被调用的语句不再用于该连接-因此它们也很可能被释放(优化不会被缓存)。 那些确实会被重用的东西会保留下来(直到不再需要为止,然后同样的问题适用于如何释放它们)。

Should PDO prepared statements be freed up after use? And if so, how?

在MySQL的上下文中?没有为什么?

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

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

您还链接到DEALLOCATE PREPARE。仅当使用SQL字符串手动调用PREPARE时才需要该语法。这是与PDO_MYSQL使用的基于MySQL C级基于API的预准备语句相比完全独立的操作。 (好的,也许您正在使用mysqlnd,但这实际上是同一回事。)

抱歉-我应该澄清我指的是使用真实的预备语句。我找不到源,但是我记得读过,调用" prepare()"确实会向数据库调用" PREAPRE"-这引出了我应该调用DEALLOCATE PREPARE的问题。我将按照您的要求测试是否未调用PREPARE-我的所有查询都已记录在工作中,因此请尽快与您联系。我没有缓冲查询。感谢您的回复-一天后会跟进。

如果在处理C代码(和mysqlnd)使用的线级API时,在任何地方都看到实际的PREPARE SQL,那会很麻烦。那真是太不对劲了,以至于我对它的错感将被震惊数周。

无需戴帽子-我只是按照您的描述检查了日志和日志。 PREPARE不会出现,但是对prepare()的调用会出现-与您链接的C级API匹配。而且mysql_stmt_close(stmt))似乎也立即被调用,大概是在PHP中将stmnt设置为" null"时(显然是有限的测试,但日志中总是紧随其后的是" stmt close")。感谢您的指点-我会做得对,让东方感到不适。

是。完成prepare语句后,可以将其设置为NULL或使用unset()。

对于具有多个查询和大型数据库的脚本,这会有所不同。您可以测试:

$before = memory_get_usage();

$stmt = NULL;

die(memory_get_usage() - $before);

对我来说,这节省了20MB的内存,后来使脚本崩溃了。

问题不是关于pdo语句,而是关于准备好的语句。在保存20MB的同时,您应该一直在使用无缓冲查询

这与PDOStatement有关,既是预准备的语句,也是结果集。也许将它们分开会更优雅。无缓冲查询引入了其他设计约束。具体来说,您可能没有在连接上打开多个活动的非缓冲查询,这在我的应用程序中是不可接受的约束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值