Laravel 教程:使用Fast Excel解決導出超大 XLSX 文件(千萬級)帶來的內存問題


TL;DR: 本文介紹 Laravel 的 FastExcel 組件,文中會對 PHP generators 速覽,並給出如何在節約內存的同時結合兩者從數據集生成 Excel 文件。

關於 FastExcel

Laravel FastExcel 旨在成為 Laravel 風格的 Spout, 目的是簡化 導入 / 導出。它可以看作是 Laravel Excel 的一種更快(且對內存更友好)的替代方案,只是方法不同且功能較少。 分兩步實施。

首先,composer 方式安裝:

composer require rap2hpoutre/fast-excel

  

然后,導出一個 Model 或者 Collection to XLSXCSV or ODS:

fastexcel($collection)->export('file.xlsx');

  

更多詳情請參考 README of the project homepage.

Generators(生成器)

Generators 於多年前在 PHP 5 中引入。「生成器」函數很像普通函數,只是它不返回一個確定值,而是「生成器」yields 值,以便你根據需求生成需要迭代的值。

此類函數的目標之一是 延遲迭代 數據而不構建數組。因此,在處理大型數據集時可以節約內存。詳情請參考 PHP 文檔:

「生成器」允許你在 foreach 代碼塊中編寫代碼來遍歷一組數據,而無需在內存中構建數組。因為那樣可能會導致超出內存限制,或需要大量的處理時間才能生成。

假定現在有一個 User 模型,數據庫中有 10M+ 條,你想在代碼中迭代它們,除了調用 User::all(), 你也可以使用「生成器」:

function usersGenerator() {
    foreach (User::cursor() as $user) {
        yield $user;
    }
}

$users = usersGenerator();
foreach($users as $user) {
    // Do something with each user without hitting memory limit
}

  

上面這個示例在運行查詢時是一個接一個地取出用戶數據。它僅僅是使用加載一個用戶所需的內存 N 次。

使用 FastExcel 和 Generators 導出大型數據集

從 v1.3.0 起, FastExcel 接受一個生成器函數作為參數。接前面的示例,你可以將生成器傳遞給 fastexcel 函數:

function usersGenerator() {
    foreach (User::cursor() as $user) {
        yield $user;
    }
}

// Export consumes only a few MB, even with 10M+ rows.
$users = usersGenerator();
fastexcel($users)->export('test.xlsx');

  

 

FastExcel 在內部使用生成器時是一行一行地創建,因此不會消耗額外的內存。這會是一個耗時操作,因此請確保不會觸到 max_execution_time 限制 (你可以使用隊列、 任何的異步技術、增加最大執行時間、甚至是從 CLI 執行)。盡管這樣,仍然要注意,不要因一個導出操作耗盡你的服務器所有的內存。

因此,借助「生成器」,你現在可以在 Laravel 項目中使用幾行代碼將成千上萬個模型數據導出到 XLSX,CSV 和 ODS 文件中。

欲了解這個組件的更詳細信息請移步到: 

 

轉自鏈接:Laravel 教程:使用 Fast Excel 解決導出超大 XLSX 文件(千萬級)帶來的內存問題

 

更多學習內容請訪問:

騰訊T3-T4標准精品PHP架構師教程目錄大全,只要你看完保證薪資上升一個台階(持續更新)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM