zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    kendo ui 查找treelist里的子控件并设置是否显示的方法
    KendoUi下的DatePicker在谷歌浏览器上不能正常显示时间的解决方法
    asp.net 第三方UI控件 Telerik KendoUI 之 TreeVIew 的用法记录
    mysql批量更新数据,即:循环select记录然后更新某一字段
    Sql语句备份Sqlserver数据库
    3des用法示例,已测试
    制作Windows服务项目详细攻略
    利用好压在C#程序里实现RAR格式的压缩和解压功能
    winform里textBox无法获得焦点的解决方案
    Shell脚本批量重命名案例
  • 原文地址:https://www.cnblogs.com/Jackey-fighting/p/9031876.html
Copyright © 2011-2022 走看看