gpt4 book ai didi

php - PHP7 的 PDO ext 是否将整个结果集读入内存?

转载 作者:IT老高 更新时间:2023-10-29 00:17:09 25 4
gpt4 key购买 nike

自从我升级到 PHP7 后,我注意到一些 SQL 语句不再有效,而是耗尽了内存。

我有这个代码:

$query = Yii::$app->db->createCommand('select * from tbl_title')->query();
while ($row = $reader->read()) {
var_dump($row);
exit();
}

Yii2 的数据库抽象只是 PDO 之上的一个极薄的层,不会做任何额外的事情。 query() 除了在日志文件 (Yii2's) 中添加一行用于分析,reader->read() 只是调用 PDO 流的 fetch( ) 函数。

但是它用完了引用我的表的大小(已用空间)的内存,即尝试分配 385 MB 的进程内存:

Allowed memory size of 134217728 bytes exhausted (tried to allocate 385883840 bytes)

作为 Spanner ,如果我使用其结果集完全符合 PHP 进程的 128 MB 限制的查询。

那么,PHP7 变了吗,我可以改回来吗?

最佳答案

它与 PHP7 没有直接关系。该问题是由于新的 mysqlnd 驱动程序造成的,因此即使使用 PHP 5.x,您也会遇到同样的问题。这实际上是一个错误修复,因为甚至在内存仍然分配之前,但它并没有计入 memory_limit

为避免内存问题,您必须对大型结果集使用无缓冲查询

因此,对于需要大型数据集的查询,请像这样设置正确的设置:

$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

为了进一步阅读,我有一个 decent explanation in my PDO tutorial ,感谢 Nikic,他的重要反馈非常宝贵。

关于php - PHP7 的 PDO ext 是否将整个结果集读入内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39786134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com