自从我升级到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是否已更改,我可以将其更改回来吗?
答案 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,他的批评性反馈非常宝贵。