你有沒有想過 "在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這意味著我們的幾行指令碼消耗了超過 308.35 mb
16.35 mb
32.35 mb
mb
的記憶體, 每次你你新增乙個元素到$valuesarray
陣列中, 都會增加他在記憶體中的大小。
讓我們使用 yield 同樣的例子:
<?php
function getvalues()
}}$myvalues = getvalues(); // 在迴圈之前都不會有動作
foreach ($myvalues as $value) {} // 開始生成資料
這個指令碼的輸出令人驚訝:
0.34 mb這不意味著你從 return 表示式遷移到 yield,但如果你在應用中建立會導致伺服器上記憶體出問題的巨大陣列,則 yield 更加適合你的情況。0.34 mb
0.34 mb
0.34 mb
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函式沒有足夠的引數來使用,比 如當你想構建乙...