PHP性能優化利器:生成器 yield理解

之前最先寫Python的時候對生成器這個內存性能優化的寫法不陌生,可是但多PHPer或許都不知道生成器這個功能,多是由於生成器是PHP 5.5版本引入的功能,也能夠是生成器做用不是很明顯。可是,生成器功能的確很是有用。 最近在寫csv導入導出,須要處理大量的數據,想到了PHP的生成器,寫個總結吧php

優勢

生成器有哪些優勢,以下:

  • 生成器會對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 接口的方式,性能開銷和複雜性大大下降。

文章結尾

文章均爲原創手寫,若有錯誤但願指出。

相關文章
相關標籤/搜索