編碼的世界 / 優質文選 / 文明

php中yield的用法


2021年10月14日
-   


之前有聽過php 中自身也有協程,查看找了下並學習。
demo已上傳 我的github筆記

yield 解決的問題


解決運行內存的瓶頸,php程序中的變量存儲在內存中,之前有遇到過讀取Excel文件時候,會出現內存不足,出現:
Fatal Error: Allowed memory size of xxxxxx bytes

所以會設置php 最大運行內存的設置: ini_set('memory_limit', '200M')
但是當我們讀取5g 這麼大的文件的時候,我們運行內存可能就吃不消了,所以會選擇yield

初識Yield


運行:
<?php
function createRange($number){
$data = [];
for($i=0;$i<$number;$i++){
$data[] = time();
}
return $data;
}
$data =createRange(10);
foreach($data as $value){
sleep(1);//這裏停頓1秒,我們後續有用
echo $value.PHP_EOL;
}


時間是一樣的。如果采用yield:
<?php
function createRange($number){
for($i=0;$i<$number;$i++){
yield time();
}
}
$data =createRange(10);
foreach($data as $value){
sleep(1);//這裏停頓1秒,我們後續有用
echo $value.PHP_EOL;
}

時間則間隔一秒鐘,所以通過yield 的例子知道,不是像第一個例子中把for 循環的內容儲存在內存中,而是一個一個消耗。

讀取文件的例子


創建一個txt 文件寫入:
第1行
第2行
第3行
第4行
第5行
第6行
第7行
第8行

<?php
function readTxt()
{
# code
$handle = fopen("./test.txt", 'rb');
while (feof($handle)===false) {
# code
yield fgets($handle);
}
fclose($handle);
}
foreach (readTxt() as $key => $value) {
# code
sleep(1);
echo $value;
}

用php 讀取文件,則是一行一行的讀取 到這邊,大概知道了yield 的作用了,之後咱再深入
參考文章

熱門文章