php的隐藏知识点--yield

很多PHPer都忽略一个强大的知识点yield - 产出值,那我们先来说说他的优点 和 场景:

1,优点:

1)能够提高PHP的性能;

2)能够节省内存资源;

3)能够用于大数据的处理;

2,场景:

1)大数据的处理,比如100W,甚至1000W;

2)读取文件,比如csv,txt等的大数据文件,比如5个G的;

 

接着来说说它的具体操作,直接上代码:

平时我们会直接用这样来把所有的数据存储到$data数组中,一次性存完:

function test($num){
    for ($i=0; $i < $num; $i++) {
     $data[] = $i;
    }
}

$result = test(10);

foreach($result as $value){

   echo value.'<br/>';

}

但如果数据过大的时候,比如1000W,这样就会造成内存性能的消耗,如果硬件不强,则可能整个服务器崩溃,那这个时候yield就派上用场了:

function test($num){
     for ($i=0; $i < $num; $i++) {
        yield $i;
     }
}

$result = test(10000000);

foreach($result as $value){

     echo $value.'<br/>';

}

这个时候输出,可能会受到php.ini的时间上的限制报错提示,如:  Maximum execution time of 30 seconds

那这个时候就可以在程序上面设置 set_time_limit(0);//来表示无限制超时时间。

yield的作用实际上是结合foreach来使用的,因为你 test()函数里面循环一次,然后在内存上告诉foreach,我已经循环一次有数据了,你可以获取了,接着foreach循环一次,也就在调用test()方法里的for循环一次,就一次一次的执行,并不是一次性所有都执行完毕,这样在很大程序上利用好了内存,并间接的提高了php的性能。

在来看个例子:

function getContent($url){

     $fp = fopen($url, 'r');

     yield  fgets($fp); //读取文件一行一行的数据

}

foreach(getContent($url)  as $value){

  echo $value.'<br/>';

}

这样就可以完美的读取几个G以上的文件了,也不会卡死。

若各位看客有疑问或者觉得哪里不好的,可以留言交流,技术在于交流和不足中完善,转载请注明出处,thanks。

posted @ 2018-05-13 13:16  Jackey-fighting  阅读(264)  评论(0编辑  收藏  举报