加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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的进程内存:

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

作为扳手,如果我使用的结果集完全符合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,他的批评性反馈是非常宝贵的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读