首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 生成器入門:以 xrange 為例解決大數據迭代內存問題

     編輯:PHP 相關知識

PHP 生成器實戰:高效處理大數據集

PHP 5.5 引入生成器,通過 yield 關鍵字實現惰性求值,極大降低大數據迭代的內存佔用。本文通過對比 range() 與自定義生成器 xrange(),演示生成器如何解決內存耗盡問題。

問題背景

// 直接創建一億個元素的數組會導致內存耗盡
// Fatal error: Allowed memory size of 134217728 bytes exhausted
range(1, 100000000);

生成器解決方案

function xrange($start, $limit, $step = 1) {
    for ($i = $start; $i <= $limit; $i += $step) {
        yield $i; // 每次產生一個值,函數暫停
    }
}

// 使用生成器迭代
foreach (xrange(1, 9, 1) as $number) {
    echo "$number "; // 輸出: 1 2 3 4 5 6 7 8 9
}

核心原理

  • 惰性求值:只有在 foreach 請求下一個值時,生成器才會執行到下一個 yield。
  • 狀態保持:函數執行上下文(變量值、指令指針)在 yield 處凍結,下次恢復繼續執行。
  • 內存常數級:無論迭代多少元素,內存佔用僅為單個元素大小加常數開銷。

適用場景

  • 讀取大文件(如 CSV、日誌)逐行處理
  • 數據庫大結果集分批獲取
  • 生成大範圍序列(如 ID、日期範圍)
  • 管道式數據流處理

進階用法

// 生成器返回值 (PHP 7+)
function gen() {
    yield 1;
    yield 2;
    return "done";
}
$g = gen();
foreach ($g as $v) { echo $v; }
echo $g->getReturn(); // "done"

// 委托生成器
function inner() { yield 'a'; yield 'b'; }
function outer() { yield from inner(); yield 'c'; }
// 輸出 a b c

生成器是 PHP 處理大數據、流式處理的利器,善用它能讓代碼更優雅、高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved