牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2017-04-07 投稿人: 浏览次数:949

高效迭代处理大型数据

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

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。