一文搞懂:yeild理解

简介: 一文搞懂:yeild理解

"

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

每//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg1NDIwNA==.html

次被加载到内存中的文字只有一行,大大的减小了内存的使用。这样,即使读取上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.'

';

}

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

function createRange($number){

for($i=0;$i[span style=""color: rgba(128, 0, 128, 1)"">$number;$i++){

yield time();

}

}

$result = createRange(10); // 这里调用上面我们创建的函数

foreach($result as $value){

sleep(1);

echo $value.'

';

}

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

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

首先调用 createRange 函数,传入参数10//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg1NTMyNA==.html

,但是 for 值执行了一次然后停止了,并且告诉 foreach 第一次循环可以用的值。

foreach 开始对 $result 循环,进来首先 sleep(1) ,然后开始使用 for 给的一个值执行输出。

foreach 准备第二次循环,开始第二次循环之前,它向 for 循环又请求了一次。

for 循环于是又执行了一次,将生成的时间戳告诉 foreach .

foreach 拿到第二个值,并且输出。由于 foreach 中 sleep(1) ,所以, for 循环延迟了1秒生成当前时间

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

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


"
image.png
相关文章
|
7月前
|
机器学习/深度学习 人工智能 运维
10 分钟搞懂 LLMOps
10 分钟搞懂 LLMOps
480 0
|
7月前
|
人工智能 网络协议 算法
5 分钟搞懂 ECN
5 分钟搞懂 ECN
865 0
|
1天前
|
数据可视化 API
一文搞懂:【Havok】
一文搞懂:【Havok】
一文搞懂:_.cloneDeep(value)
一文搞懂:_.cloneDeep(value)
|
1天前
|
API
一文搞懂:关于串行接口
一文搞懂:关于串行接口
|
2天前
一文搞懂:关于“isbuzy”问题
一文搞懂:关于“isbuzy”问题
|
2天前
|
机器学习/深度学习 定位技术
一文搞懂:【OpenJ_Bailian
一文搞懂:【OpenJ_Bailian
|
2天前
一文搞懂:【华为oj】iNOC产品部
一文搞懂:【华为oj】iNOC产品部
|
2天前
|
前端开发 JavaScript
一文搞懂:【Reduc】ReactCounterExample
一文搞懂:【Reduc】ReactCounterExample
|
2天前
一文搞懂:【NISACTF2022】bqt
一文搞懂:【NISACTF2022】bqt