在 PHP 中使用 yield 來做記憶體優化

2021-09-29 02:45:45 字數 2487 閱讀 7889

你有沒有想過 "在php中使用 yield 會有什麼益處",我將為你節省一些谷歌搜尋的時間; 我列出了一些要向你介紹的要點來全面認知 yield:

什麼是 yield。

yield & return 的區別。

yield 有什麼選項。

結論。參考。

1. 什麼是 "yield"

生成器函式看上去就像乙個普通函式, 除了不是返回乙個值之外, 生成器會根據需求產生更多的值。

來看以下的例子:

function getvalues() 

// 輸出字串 "value"

echo getvalues();

當然, 這不是他生效的方式, 前面的例子會給你乙個致命的錯誤:類生成器的物件不能被轉換成字串, 讓我們清楚的說明:

2. "yield" & "return" 的區別

前面的錯誤意味著getvalues()方法不會如預期返回乙個字串,讓我們檢查一下他的型別:

function getvalues() 

var_dump(getvalues()); // string(5) "value"

function getvalues()

var_dump(getvalues()); // class generator#1 (0) {}

生成器 類實現了 生成器 介面, 這意味著你必須遍歷getvalue()方法來取值:

foreach (getvalues() as $value) 

// 使用變數也是好的

$values = getvalues();

foreach ($values as $value)

但這不是唯一的不同!

乙個生成器執行你寫使用迴圈來迭代一維陣列的**,而不需要在記憶體中建立是乙個陣列,這可能會導致你超出記憶體限制。

在下面的例子裡我們建立乙個有 800,000 元素的數字同時從getvalues()方法中返回他,同時在此期間,我們將使用函式 memory_get_usage() 來獲取分配給次指令碼的記憶體, 我們將會每增加 200,000 個元素來獲取一下記憶體使用量,這意味著我們將會提出四個檢查點:

<?php

function getvalues()

}return $valuesarray;

}$myvalues = getvalues(); // 一旦我們呼叫函式將會在這裡建立陣列

foreach ($myvalues as $value) {}

前面例子發生的情況是這個指令碼的記憶體消耗和輸出:

0.34 mb

8.35 mb

16.35 mb

32.35 mb

這意味著我們的幾行指令碼消耗了超過 30mb的記憶體, 每次你你新增乙個元素到$valuesarray陣列中, 都會增加他在記憶體中的大小。

讓我們使用 yield 同樣的例子:

<?php

function getvalues()

}}$myvalues = getvalues(); // 在迴圈之前都不會有動作

foreach ($myvalues as $value) {} // 開始生成資料

這個指令碼的輸出令人驚訝:

0.34 mb

0.34 mb

0.34 mb

0.34 mb

這不意味著你從 return 表示式遷移到 yield,但如果你在應用中建立會導致伺服器上記憶體出問題的巨大陣列,則 yield 更加適合你的情況。

3. 什麼是 "yield" 選項

這裡有很多 yield 的選項, 我將強調他們中的幾個:

a. 使用 yield, 你也可以使用 return。

function getvalues() 

$values = getvalues();

foreach ($values as $value) {}

echo $values->getreturn(); // 'returnvalue'

b. 返回鍵值對:

function getvalues() 

$values = getvalues();

foreach ($values as $key => $value)

4. 結論

這個主題的主要原因是為了明確 yield 和 return 特別是在記憶體使用方面的區別,使用一些例子是因為我發現他對任何開發人員思考真的很重要。

5. 參考

使用php來做守護程序

起源 linux unix下守護程序 daemon 大家都知道,比如我們常用的httpd mysqld等等,就是常駐記憶體執行的程式,類似於windows下的服務。一般守護程序都是使用c c 來寫,就是通過fork生成子程序,當前臺shell下的父程序被殺掉,子程序就轉到後台執行,為了不在終端產生輸...

在php中使用Sphinx

要使用php連線sphinx進行全文搜尋,有兩種方式 將sphinx作為php擴充套件安裝,這種方式比較麻煩,此處不介紹 在sphinx原始碼目錄下的有個api sphinxapi.php,將此檔案reqire到你的php中,即可呼叫api方法進行全文搜尋 require sphinxapi.php...

在PHP中使用Curl

摘要 在這篇文章中主要講解php curl庫的知識,並教你如何更好的使用php curl。簡介你可能在你的編寫php指令碼 中會遇到這樣的問 題 怎麼樣才能從其他站點獲取內容呢?這裡有幾個解決方式 最簡單的就是在php中使用fopen 函式,但是fopen函式沒有足夠的引數來使用,比 如當你想構建乙...