[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 的作用了,之后咱再深入
- 重点知识预览
- 理解面向对象
- 魔术变量
- 魔法方法
- 面试题基础篇
- PSR标准
- class (单继承)
- trait (多继承)
- 匿名函数
- 日期处理
- 文件处理
- 字符串处理
- BC Math
- 数组处理
- HTTP的各个状态
- PHP环境变量
- session & cookie
- composer
- 变量的类型转换和判断类型方法
- PHP的错误和异常处理
- PHP的ob缓冲区
- PHP内存调试
- pcntl多进程
- PHP yield (生成器):节约内存
- Nginx负载均衡
- 同一台服务器如何测试负载均衡
- 安全方面
- HTTPS实现
- PHP性能分析(xhprof)
- 高并发雪崩解决方法
- 接口加密设计(安全性)
- 数据库(重要数据操作)日志记录规范
- APP发版操作
- 缓存使用
- Memcache
- MYSQL缓存
- Redis
- 安装与使用
- redis过期策略和内存淘汰机制
- Redis分布式锁
- Redis雪崩、穿透、击穿问题
- redis主从
- redis哨兵
- opcache
- 消息队列
- Redis消息队列
- Beanstalkd
- 数据库汇总
- MYSQL哪些情况下会忽略索引
- MYSQL常用命令
- SQL高级运用
- MYSQL分布式集群使用
- 主从复制
- 同一台服务器如何测试主从同步
- MYSQL索引类型
- MYSQL分区
- 锁机制
- 事务隔离级别(脏读、幻读、不可重复读)
- 分布式事务
- MYSQL性能优化
- swoole
- 安装以及升级
- swoole进程初识
- TCP相关教程
- TCP数据传输DEMO(含同步、异步、长连接)
- Server异步投递task任务
- TCP粘包问题
- websocket相关教程
- websocket初体验DEMO
- websocket核心功能(心跳检测、用户校验、重连机制)
- websocket用户之间通信DEMO
- 定时器的使用
- 常驻内存以及如何避免内存泄漏
- max_request使用实例
- 守护进程、信号和平滑重启
- 全文检索工具
- MYSQL全文索引
- ElasticSearch全文检索
- ES基础知识
- Mapping及增删改查
- DSL查询语法
- 搜索建议 (completion)
- mysql转dsl工具
- ES的安装与PHP测试
- kibana可视化工具
- ELK日志管理系统
- PHP设计模式
- 创建型模式
- 工厂模式
- 单例模式
- 注册器模式
- 工厂模式于策略模式的区别
- 结构型模式
- 适配器模式
- 桥接模式
- 装饰器模式
- 行为型模式
- 观察者模式
- 策略模式
- 高并发设计