之前最先寫Python的時候對生成器這個內存性能優化的寫法不陌生,可是但多PHPer或許都不知道生成器這個功能,多是由於生成器是PHP 5.5版本引入的功能,也能夠是生成器做用不是很明顯。可是,生成器功能的確很是有用。 最近在寫csv導入導出,須要處理大量的數據,想到了PHP的生成器,寫個總結吧php
首先,放下生成器概念的包袱,來看一個簡單的PHP函數:數組
function rangeNum($num){
$data = [];
for($i=0;$i<$num;$i++){
$data[] = time();
}
return $data;
}
複製代碼
這是一個很是簡單的PHP函數,咱們在處理一些數組邏輯的時候常常會使用。這裏的代碼也很是簡單。性能優化
下面咱們再寫一個函數去取出$data中的數據函數
$data = rangeNum(10);
foreach($data as $value){
sleep(1);
echo $value.'<br />';
}
複製代碼
這裏很是完美,沒有任何問題。性能
咱們在調用函數時傳遞1000w或者更多的時候,那麼調用函數的時候for循環1000w次$data裏面的1000w條數據都是存儲在內存當中的,在調用函數時候會佔用大量內存優化
咱們直接修改函數spa
function rangeNum($num){
for($i=0;$i<$num;$i++){
yield time();
}
}
複製代碼
$data = rangeNum(10);
foreach($data as $value){
sleep(1);
echo $value.'<br />';
}
複製代碼
到這裏,你應該對生成器有點兒頭緒。excel
首先明確一個概念:生成器yield關鍵字不是返回值,他的專業術語叫產出值,只是生成一個值code
PHP開發不少時候都要讀取大文件,好比csv文件、excel文件,或者一些log文件。這些文件若是很大很大,好比20個G。這時,直接一次性把全部的內容讀取到內存中進行處理不太現實。對象
yield生成器是php5.5以後出現的,yield提供了一種更簡單的方法來實現簡單的迭代對象,相較於類實現 Iterator 接口的方式,性能開銷和複雜性大大下降。
文章均爲原創手寫,若有錯誤但願指出。