PHP7的PDO ext将整个结果集读取到内存中吗?
发布时间:2020-12-13 13:57:11 所属栏目:PHP教程 来源:网络整理
导读:我注意到,因为我升级到 PHP7,一些SQL语句不再工作,而是内存不足. 我有这个代码: $query = Yii::$app-db-createCommand('select * from tbl_title')-query();while ($row = $reader-read()) { var_dump($row); exit();} 而Yii2的数据库抽象只是PDO上的一个非
我注意到,因为我升级到
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的进程内存:
作为扳手,如果我使用的结果集完全符合PHP流程工作的128 MB限制的查询. 那么PHP7是否改变了,可以改回它吗?
它不是直接与PHP7相关的.问题是由于新的mysqlnd驱动程序,所以即使使用PHP 5.x也可以体验同样的问题.它实际上是一个错误修复,因为即使在内存仍然被分配之前,但它并没有计入内存限制.
为了避免内存问题,您必须对大型结果集使用无缓冲的查询. 因此,对于期望大型数据集的查询,请设置如下所示的适当设置: $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,TRUE); 为了进一步阅读,我有一个decent explanation in my PDO tutorial,感谢Nikic,他的批评性反馈是非常宝贵的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |