您的位置:首页 > 娱乐 > 明星 > php yield使用

php yield使用

2024/10/6 0:34:48 来源:https://blog.csdn.net/sang521jia/article/details/139605766  浏览:    关键词:php yield使用
一,概念

yield简单的调用形式看起来像一个return申明,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。yield只有在调用的时候才会执行,并不产生多余的值,比如读取一个很大的文件或者计算大量的数据时,如果直接读取很有可能内存就爆了,而yield就可以做到把数据一行行读取到php运行内存,并非一次性读取到php运行内存,这样在运行时就会节省大量的内存;还有在遍历数据库的所有记录的时候,这个记录可能会很大,例如100万行,那么通过传统的办法就行不通了,首先通过web访问,php有超时时间,默认是30秒,那么就只能通过php cli的方式来执行,这样就没有超时时间了,但由于数据量太大,php循环时需要将数据全部载入内存中执行,由于数据量太大,php会报Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 bytes)的错误,php默认的内存限制为128M,虽然可以通过修改php.ini中memory_limit的选项的值来提高内存限制,但始终不是最优的解决办法,这时通过生成器函数就可以极大节省内存开销

二,代码示例
function createRange($num){$data=[];for($i=0;$i<$num;$i++){$data[]=time();}return $data;
}$res=createRange(10);
foreach($res as $key=>$value){sleep(1);echo $value."<br />";
}

运行结果为
在这里插入图片描述
使用yield 创建一个生成器

function createRange($num){for($i=0;$i<$num;$i++){yield time();}
}
$res=createRange(10);
foreach($res as $key=>$value){sleep(1);echo $value."<br />";
}

运行结果如下
在这里插入图片描述
未使用生成器的时候,createRange 很快生成一个 10个元素的数组$data,并立即返回,所以foreach 的是一个固定的数组。使用生成器后,createRange 不是一次性生成10元素,而是在foreach 中调用他的时候,他生成一个元素返回,并暂停。就是 foreach一次,for一次。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com