网站首页php
PHP使用yield迭代器处理大数据量读取
发布时间:2017-07-04 00:57:11编辑:slayer.hover阅读(3165)
yield迭代器是在php5.5加入的新特性,可用于大数据库的循环体,如数据库大数据量的读写操作。
时间换空间,以较小的内存损耗完成大量数据的处理。
上代码:
一、不使用迭代器
$start = microtime(true); $_DB = new DB($dbconfig); $sql = "SELECT * FROM `table` limit 0,100000"; $stat = $_DB->getAll($sql); foreach($stat as $row) { print_r($row); } $time = round(microtime(true) - (float)$start, 5); echo '统计, 时间:',$time,' 内存:', (memory_get_usage(true) / 1024), "kb\r\n";
统计结果, 时间:0.2053 内存:82176kb
二、使用迭代器
$start = microtime(true); $_DB = new DB($dbconfig); function getData($_DB){ $sql = "SELECT * FROM `table` limit 0,100000"; $stat = $_DB->pdo->query($sql); while ($row = $stat->fetch()) { yield $row; } } foreach(getData($_DB) as $row) { print_r($row); } $time = round(microtime(true) - (float)$start, 5); echo '统计, 时间:',$time,' 内存:', (memory_get_usage(true) / 1024), "kb\r\n";
统计结果, 时间:0.25995 内存:1024kb
由于机子比较弱, 不使用迭代器的情况下, limit超过20000就报警:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1 bytes)。
但使用yield的话,多大的limit都没问题。
至于运行效率,既然用时间换空间了,就不用怎么考虑了 :)
评论