博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php的隐藏知识点--yield
阅读量:5088 次
发布时间:2019-06-13

本文共 1143 字,大约阅读时间需要 3 分钟。

很多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

你可能感兴趣的文章
Linux基本操作
查看>>
osg ifc ifccolumn
查看>>
C++ STL partial_sort
查看>>
3.0.35 platform 设备资源和数据
查看>>
centos redis 安装过程,解决办法
查看>>
IOS小技巧整理
查看>>
WebDriverExtensionsByC#
查看>>
我眼中的技术地图
查看>>
lc 145. Binary Tree Postorder Traversal
查看>>
sublime 配置java运行环境
查看>>
在centos上开关tomcat
查看>>
重启rabbitmq服务
查看>>
正则表达式(进阶篇)
查看>>
无人值守安装linux系统
查看>>
【传道】中国首部淘宝卖家演讲公开课:农业本该如此
查看>>
jQuery应用 代码片段
查看>>
MVC+Servlet+mysql+jsp读取数据库信息
查看>>
黑马程序员——2 注释
查看>>
用OGRE1.74搭建游戏框架(三)--加入人物控制和场景
查看>>
转化课-计算机基础及上网过程
查看>>