我是靠谱客的博主 含蓄鞋垫,最近开发中收集的这篇文章主要介绍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。

转载于:https://www.cnblogs.com/Jackey-fighting/p/9031876.html

最后

以上就是含蓄鞋垫为你收集整理的php的隐藏知识点--yield的全部内容,希望文章能够帮你解决php的隐藏知识点--yield所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部