TL;DR: 本文介紹 Laravel 的 FastExcel 組件,文中會對 PHP generators 速覽,並給出如何在節約內存的同時結合兩者從數據集生成 Excel 文件。
關於 FastExcel
Laravel FastExcel 旨在成為 Laravel 風格的 Spout, 目的是簡化 導入 / 導出。它可以看作是 Laravel Excel 的一種更快(且對內存更友好)的替代方案,只是方法不同且功能較少。 分兩步實施。
首先,composer 方式安裝:
composer require rap2hpoutre/fast-excel
然后,導出一個 Model 或者 Collection to XLSX, CSV 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 文件中。
欲了解這個組件的更詳細信息請移步到: https://github.com/rap2hpoutre/fast-excel
轉自鏈接:Laravel 教程:使用 Fast Excel 解決導出超大 XLSX 文件(千萬級)帶來的內存問題
更多學習內容請訪問:
騰訊T3-T4標准精品PHP架構師教程目錄大全,只要你看完保證薪資上升一個台階(持續更新)
