PHP经典实例读书笔记(高效迭代处理大型数据-使用yield)

PHP经典实例(php cookbook)读书笔记(0x04+)

高效迭代处理大型数据

当需要处理大型数据集的时候,整个数据集使用的内存过大甚至超过现有内存 ,此时需要使用迭代处理。
解决方式
  1. 使用生成器
     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 . 使用文件或者数据库读取

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值