• yeild 理解


    生成器yield关键字不是返回值,他的专业术语叫产出值,只是生成一个值

    每次被加载到内存中的文字只有一行,大大的减小了内存的使用。这样,即使读取上G的文本也不用担心,完全可以像读取很小文件一样编写代码。

     百万级别的访问量

    yield生成器是php5.5之后出现的,yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现 Iter

    优点:

    • 生成器会对PHP应用的性能有非常大的影响
    • PHP代码运行时节省大量的内存
    • 比较适合计算大量的数据
    
    
    function createRange($number)
    { $data = [];
      for($i=0;$i<$number;$i++)
      {
        $data[] = time();
      }
        return $data;
    }
    $result = createRange(10); // 这里调用上面我们创建的函数
    foreach($result as $value){
        sleep(1);//这里停顿1秒,我们后续有用
        echo $value.'<br />';
    }

    输出的结果是10个一样的时间戳,sleep(1)效果看不出来

    function createRange($number){
        for($i=0;$i<$number;$i++){
            yield time();
        }
    }
    
    $result = createRange(10); // 这里调用上面我们创建的函数
    foreach($result as $value){
        sleep(1);
        echo $value.'<br />';
    }

    输出的结果中间间隔了1秒

    我们来还原一下代码执行过程。

    1. 首先调用 createRange 函数,传入参数10,但是 for 值执行了一次然后停止了,并且告诉 foreach 第一次循环可以用的值。
    2.  foreach 开始对 $result 循环,进来首先 sleep(1) ,然后开始使用 for 给的一个值执行输出。
    3.  foreach 准备第二次循环,开始第二次循环之前,它向 for 循环又请求了一次。
    4.  for 循环于是又执行了一次,将生成的时间戳告诉 foreach .
    5.  foreach 拿到第二个值,并且输出。由于 foreach 中 sleep(1) ,所以, for 循环延迟了1秒生成当前时间

    所以,整个代码执行中,始终只有一个记录值参与循环,内存中也只有一条信息。

    无论开始传入的 $number 有多大,由于并不会立即生成所有结果集,所以内存始终是一条循环的值。

  • 相关阅读:
    (II)第一节:IOC 和 DI
    (I)第二节:开发环境
    (I)第一节:Spring 框架
    Spring【目录】
    MyBatisPlus 之 Oracle 数据库主键
    MyBatisPlus 之 公共字段自动填充
    MyBatisPlus 之 全局SQL注入器应用
    MyBatisPlus 之 自定义全局操作
    MyBatisPlus 之 代码生成器
    彻底理解Netty
  • 原文地址:https://www.cnblogs.com/hanmengya/p/10947835.html
Copyright © 2020-2023  润新知