PHP7的PDO ext将整个结果集读取到内存中吗?

我注意到,因为我升级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,他的批评性反馈是非常宝贵的.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...