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

时间:2016-09-30 07:37:55

标签: php mysql pdo yii2 php-7

自从我升级到PHP7以来,我注意到一些SQL语句不再有效,而是内存不足。

我有这段代码:

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

Yii2的数据库抽象只是PDO上的一个非常薄的层,并没有做任何额外的事情。 query()除了在日志文件(Yii2)中添加一行以进行性能分析,reader->read()只调用PDO流的fetch()函数外,不会做任何额外的事情。

但内存耗尽引用我的表的大小(使用的空间),即尝试分配385 MB的进程内存:

  

允许的内存大小为134217728字节耗尽(试图分配385883840字节)

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

那么,PHP7是否已更改,我可以将其更改回来吗?

1 个答案:

答案 0 :(得分:8)

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

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

因此,对于期望大型数据集的查询,请设置正确的设置,如下所示:

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

为了进一步阅读,我得到了decent explanation in my PDO tutorial,感谢Nikic,他的批评性反馈非常宝贵。