簡單了解一下php的叠代生成器yield
阿新 • • 發佈:2018-07-05
來源 tor func roo .net size fatal wro class
yield是從PHP5.5開始有的,關於yidle的說明鳥哥的博客做了詳細說明,我覺得是有點復雜,在看了幾篇其他的帖子還有案例,我大概知道yield的作用就是在做大量數據循環處理的時候,能節省很大一部分內存~
官方:http://php.net/manual/zh/language.generators.syntax.php
鳥哥:http://www.laruence.com/2015/05/28/3038.html
參考案例說明yield的作用
<?php
//普通模式的代碼
function generateData($max)
{
$arr = [];
for ($i = 0; $i <= $max; $i++) {
$arr[] = $i;
}
}
echo ‘開始前內存占用:‘ . memory_get_usage() . PHP_EOL;
$data = generateData(100000);
echo ‘生成完數組後內存占用:‘ . memory_get_usage() . PHP_EOL;
unset($data);
echo ‘釋放後的內存占用:‘ . memory_get_usage() . PHP_EOL;
# php yield.php
開始前內存占用:387600
生成完數組後內存占用:387632
釋放後的內存占用:387632
前後使用的內存差值為:387632-387600 = 32
# php yield.php
開始前內存占用:386912
生成完數組後內存占用:387520
釋放後的內存占用:386944
前後使用的內存差值為:387520-386912 = 608
明顯608要遠遠大於32,不是說是降低內存使用率麽。那麽就把循環的數值調大試試。把100000改為10000000
再使用cli模式執行,發現不適用yield會報錯了
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes) in /data/wwwroot/default /up_sql.php on line 7
但是yield依然是608,這是因為它自身,它在你進行叠代的時候才會產生真實數據。
所以如果你的數據來源非常大,那麽用 yield 吧。如果數據來源很小,當然選擇一次載入內存。
簡單了解一下php的叠代生成器yield