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等多個知識點高級進階干貨需要的可以免費分享給大家,需要的可以加入我的官方群點擊此處。