本帖最后由 wuqiong 于 2018-4-9 14:29 编辑
开发中经常遇到大量导出数据的场景,如果只是几千条数据还好,随意框架写个find()方法就出来了。如果几十万,上百万出来的数组数据就很容易将内存搞爆掉。
那如何取出大量数据,而又不存到数组中呢?这就要用到了PHP中的迭代器:Iterator。如果有看过PDO::query的返回值类型的话,我们会发现,这个方法返回的 PDOStatement,正是对 Iterator 的实现。关于 Iterator,请自行脑补。
$sql = 'select * from user';
$pdo = new \PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root');
$pdo->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$rows = $pdo->query($sql);
foreach ($rows as $row) {
$line = [$row['id'], $row['username'], $row['password'], $row['create_time']];
} 在表中生成7位数量级的记录,执行上面的代码,通过查看内存使用,发现整个过程只占用了0.XM的内存。
(网络搬运工,幸福你我他)
|