首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >意外地用一个PDO查询达到PHP内存限制吗?

意外地用一个PDO查询达到PHP内存限制吗?
EN

Stack Overflow用户
提问于 2012-12-05 16:42:55
回答 1查看 15.4K关注 0票数 19

我有一个非常简单的查询,类似于:

代码语言:javascript
复制
$result = $pdo->query('SELECT * FROM my_table');

foreach($result as $r) {
    // do some stuff
}

但是,当我运行这个程序时,我会得到以下错误:

致命错误:允许在第15行/path/ to /myfile.php中耗尽内存134217728字节(尝试分配32个字节)

“第15行”是$pdo->query行。

如果我将die()放在查询之后,仍然会得到相同的错误。

我以为这一次只能取一行,为什么要用这么多内存呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-05 18:15:19

调用查询之前,内存使用量为635384字节。我猜查询是按块分配的,为每个记录分配。

丁仃丁!

当连接到MySQL时,PHP喜欢使用缓冲查询。无论您使用何种方法连接,都是正确的。当使用缓冲查询时,会立即获取整个结果集,而不是当您询问时被获取。这通常对性能有好处,因为往返旅行较少。

但是,就像PHP中的所有东西一样,也有一个问题。正如缓冲页面中所指出的:

当使用libmysql作为库时,PHP的内存限制不会计算用于结果集的内存,除非数据被提取到PHP变量中。使用mysqlnd,内存将包含完整的结果集。

您正在使用PHP5.3,这意味着很有可能使用mysqlnd。

您需要在这里关闭缓冲查询。它在MySQL的每个PHP接口中都是不同的:

  • 对于PDO,需要将PDO::MYSQL_ATTR_USE_BUFFERED_QUERY属性设置为false
  • 对于mysqli,需要将MYSQLI_USE_RESULT常量传递给query方法。
  • 对于mysql,您需要调用mysql_unbuffered_query而不是mysql_query

详细信息和示例都在页面上。

大胖无缓冲查询抓到你了!

在发出另一个查询之前,必须正确关闭语句句柄并释放结果集:

  • 在PDO中,这意味着对语句句柄调用closeCursor
  • 在mysqli中,这意味着调用语句句柄上的free_result或结果句柄上的free,这取决于您使用的是什么。
  • 在mysql中,这意味着调用mysql_free_result

如果不这样做,将导致错误。

票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13728106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档