PHP经典实例(php cookbook)读书笔记(0x04+)
高效迭代处理大型数据
当需要处理大型数据集的时候,整个数据集使用的内存过大甚至超过现有内存 ,此时需要使用迭代处理。
解决方式
- 使用生成器
function FileLineGenerator('log.txt'){
if(!$fh = fopen($file, 'r')){
return;
}
while(false != ($line = fgets($fh))){
yield $line;
}
fclose($fh);
}
$file = FileLineGenerator('log.txt');//迭代返回
doSomething($file);
yield 是php 5.5出现的一个新特性
当程序运行到yield的时候,使用协程将上下文环境记录住,然后将程序操作权和返回值返还到上一级,在程序结束的后,会重新唤起协程,读取yield记录的上下文,继续执行。
可以看看下面的例子
function gen_one_to_three() {
for ($i = 1; $i <= 3; $i++) {
//注意变量$i的值在不同的yield之间是保持传递的。
yield $i;
echo $i.'-forEnd|' ;
}
echo'-functionEnd-';
}
$generator = gen_one_to_three();
foreach ($generator as $value) {
echo "$value".'-mainEnd|';
}
输出 :
1-mainEnd|1-forEnd|2-mainEnd|2-forEnd|3-mainEnd|3-forEnd|-functionEnd-
可以发现程序在碰到第一个yield后保存上下文之后返回主程序执行,主程序执行后再返回yield继续执行循环,循环执行完后才结束函数
详细查看http://php.net/manual/zh/language.generators.overview.php
2 . 使用文件或者数据库读取