Sam*_*aye 13 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();
}
Run Code Online (Sandbox Code Playgroud)
Yii2的数据库抽象只是PDO上的一个非常薄的层,并没有做任何额外的事情.query()除了在日志文件(Yii2)中添加一行以进行性能分析并reader->read()只调用PDO流的fetch()功能之外,什么都不做.
但它的内存耗尽引用我的表的大小(使用的空间),即尝试分配385 MB的进程内存:
允许的内存大小为134217728字节耗尽(试图分配385883840字节)
作为一个扳手,如果我使用一个查询,其结果集完全符合PHP进程的128 MB限制.
那么,PHP7已经改变了,我可以改回来吗?
You*_*nse 10
它不直接与PHP7相关.问题是由于新的mysqlnd驱动程序,所以即使使用PHP 5.x也可以遇到同样的问题.它实际上是一个错误修正,因为即使在内存仍然分配之前,它也没有计入memory_limit.
要避免内存问题,必须对大型结果集使用无缓冲查询.
因此,对于期望大型数据集的查询,请设置正确的设置,如下所示:
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
Run Code Online (Sandbox Code Playgroud)
为了进一步阅读,我在PDO教程中得到了一个不错的解释,感谢Nikic,他的批评反馈非常宝贵.