場景: 處理大數組的時候,好比循環更新數據或者導出訂單數據到excel文件,普通方式可能會引發"Allowed memory size of XXXXX bytes exhausted" 錯誤,而yield方式能夠節省不少內存,就不會有這個問題啦!!!php
代碼環境: MacOs / php7.1.3 / 8G ram數組
<?php /** * Created by PhpStorm. * User: lf * Date: 2017/3/30 * Time: 15:55 */ $t1 = microtime(true); //common 方式 class common_data { function data() { $array = []; for ($i = 1; $i <= 1000000; $i++) { $array[] = 'item_' . $i; } return $array; } function callback($param) { // echo $param; return $param; } } //yield 方式 class yield_data { function data() { for ($i = 1; $i <= 1000000; $i++) { $array = 'item_' . $i; yield $array; } } function callback($param) { // echo $param; return $param; } } //$commn = new common_data(); //$data= $commn->data(); //foreach ($data as $value) { // $commn->callback($value); //} $yield = new yield_data(); $data = $yield->data(); foreach ($data as $value) { $yield->callback($value); } $t2 = microtime(true); echo '耗時' . round($t2 - $t1, 7) . '秒<br>'; echo '內存: ' . memory_get_usage() / 1024 . 'K<br />';
結果:php7
yield 方式 :測試
耗時0.184339秒
內存: 349.984375Kexcel
common 方式:code
耗時0.1598852秒
內存: 72183.375K 72MB!!!!orm
可見二者之間的內存佔用差距是至關的大啊!!內存
同時,yield方式相對會耗時一丟丟,但差距不是很大.不知道在低版本的php裏運行會是什麼結果,你們能夠拿代碼去進行測試.🙃get