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

TL;DR: 本文介紹 Laravel 的 FastExcel 組件,文中會對 PHP generators 速覽,并給出如何在節(jié)約內(nèi)存的同時結合兩者從數(shù)據(jù)集生成 Excel 文件。

關于 FastExcel

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

首先,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 中引入?!干善鳌购瘮?shù)很像普通函數(shù),只是它不返回一個確定值,而是「生成器」yields?值,以便你根據(jù)需求生成需要迭代的值。

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

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

假定現(xiàn)在有一個?User?模型,數(shù)據(jù)庫中有 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

}

上面這個示例在運行查詢時是一個接一個地取出用戶數(shù)據(jù)。它僅僅是使用加載一個用戶所需的內(nèi)存?N?次。

使用 FastExcel 和 Generators 導出大型數(shù)據(jù)集

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

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

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

欲了解這個組件的更詳細信息請移步到:?https://github.com/rap2hpoutre/fast-excel


更多學習內(nèi)容請訪問:

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

以上內(nèi)容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業(yè)務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發(fā)、服務器性能調優(yōu)、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優(yōu)化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的可以加入我的官方群點擊此處

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容