[TOC] ## 应用场景 > yeild实质上是一个Generator迭代器,所以如果读取大数据时,其实质只会保留迭代器一条数据的内存空间。 > 1. 生成器会对PHP应用的性能有非常大的影响 > 2. PHP代码运行时节省大量的内存 > 3. 比较适合计算大量的数据 > 比如:处理过大的Excel文件或者大数据时,容易出现内存不足,就可以使用yield来解决 ``` Fatal Error: Allowed memory size of xxxxxx bytes ``` > [参考实例](https://www.cnblogs.com/zuochuang/p/8176868.html) ## (一) 初识Yield ### 未使用yield ``` function createRange($number){ $data = []; for($i=0;$i<$number;$i++){ $data[] = time(); } return $data; } $data =createRange(10); foreach($data as $value){ # 停顿1秒 sleep(1); echo $value.PHP_EOL; } ``` ![](https://img.kancloud.cn/d1/81/d181d9ffc9fac8c900e9814fac3cdf97_543x250.png) > 时间是一样的,因为是一次性加载到$data[]数组中的; ### 采用yield ``` function createRange($number){ for($i=0;$i<$number;$i++){ yield time(); } } $data =createRange(10); foreach($data as $value){ # 这里每一次的foreach循环时,都会去createRange()里的yield迭代器读取信息 # 至始至终只会保留一条数据的内存空间。 sleep(1); echo $value.PHP_EOL; } ``` ![](https://img.kancloud.cn/c3/8e/c38e52b7ee1ebf62913a8d98fdb31fd1_709x280.png) > 时间则间隔一秒钟,所以通过yield 的例子知道,不是像第一个例子中把for 循环的内容储存在内存中,而是一个一个消耗。 ## (二) 读取文件的实例 ### 1. 创建一个txt | 行号 | 内容 | | --- | --- | | 1 | 第1行 | | 2 | 第2行 | | 3 | 第3行 | | 4 | 第4行 | | 5 | 第5行 | | 6 | 第6行 | | 7 | 第7行 | | 8 | 第8行 | ### 2. yield读取txt ``` function readTxt() { $handle = fopen("./test.txt", 'rb'); while (feof($handle)===false) { # code... yield fgets($handle); } fclose($handle); } foreach (readTxt() as $key => $value) { sleep(1); echo $value; } ``` > 用php 读取文件,则是一行一行的读取 ![](https://img.kancloud.cn/35/48/3548569fda5aa4bde99728fd30c4745c_562x309.png) > 到这边,大概知道了yield 的作用了,之后咱再深入