[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;
}
```

> 時間是一樣的,因為是一次性加載到$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;
}
```

> 時間則間隔一秒鐘,所以通過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 讀取文件,則是一行一行的讀取

> 到這邊,大概知道了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設計模式
- 創建型模式
- 工廠模式
- 單例模式
- 注冊器模式
- 工廠模式于策略模式的區別
- 結構型模式
- 適配器模式
- 橋接模式
- 裝飾器模式
- 行為型模式
- 觀察者模式
- 策略模式
- 高并發設計