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一次。

相关推荐

  1. conda使用,pip使用

    2024-06-11 20:24:04       58 阅读
  2. VueUse使用

    2024-06-11 20:24:04       69 阅读
  3. Git<span style='color:red;'>使用</span>

    Git使用

    2024-06-11 20:24:04      60 阅读
  4. netty使用

    2024-06-11 20:24:04       57 阅读
  5. gdb<span style='color:red;'>使用</span>

    gdb使用

    2024-06-11 20:24:04      63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-11 20:24:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-11 20:24:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-11 20:24:04       87 阅读
  4. Python语言-面向对象

    2024-06-11 20:24:04       96 阅读

热门阅读

  1. 02. fastLed 基本用法

    2024-06-11 20:24:04       22 阅读
  2. angular2网页前端执行流程

    2024-06-11 20:24:04       31 阅读
  3. 制作手机IOS苹果ipa应用的重签名工具

    2024-06-11 20:24:04       30 阅读
  4. golang生成根证书,服务端证书,用于 tls

    2024-06-11 20:24:04       31 阅读
  5. WEB前端三大主流框架

    2024-06-11 20:24:04       33 阅读
  6. Docker面试整理-如何进行Docker镜像的构建和发布?

    2024-06-11 20:24:04       32 阅读
  7. es6基础语法

    2024-06-11 20:24:04       22 阅读
  8. React框架基础教程

    2024-06-11 20:24:04       28 阅读
  9. 电商财务管理---云账户系统

    2024-06-11 20:24:04       29 阅读