1. 程式人生 > >簡單了解一下php的叠代生成器yield

簡單了解一下php的叠代生成器yield

來源 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