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架構師教程目錄大全,只要你看完保證薪資上升一個臺階(持續更新)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/69402.html
標籤:PHP
