您的位置:首頁>正文

分享:PHPExcel大資料的匯出解決方案

PHPExcel 大資料的匯出

PHPExcel 是一個php語言讀取匯出資料、導入生成Excel的類庫, 使用起來非常方便, 但有時會遇到以些問題, 比如匯出的資料超時, 記憶體溢出等。

下面我們來說說這些問題和解決辦法。

PHPExcel 版本:@version 1.8.0, 2014-03-02

能遇到這樣的問題一般都是因為資料量大導致

1.PHPExcel 報錯

報錯提示:

'break' not in the 'loop' or 'switch' context

嚴格的講這個不是PHPExcel的錯誤, 是PHP版本的問題, 大於PHP5.6以後, “break”必須要在循環體內執行(for ,foreach, while, switch)

此處無迴圈, 解決辦法:注釋掉break;

2.超時

提示:

Maximum execution time of 30 seconds exceeded

資料量過大, php執行超過30秒後就會報這樣的資訊

解決辦法:

可修改php.ini 或直接在執行頁面中添加

set_time_limit(0);

這樣就設置了php的執行超時

3.記憶體溢出

超時解決好之後, 等待了好幾十秒後又來了個錯誤:

Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)

記憶體不足呀!

解決記憶體溢出我們分兩步走,

第一步:設置memory_limit

預設情況memory_limit 大小為100MB, 當所需記憶體大於100MB就會溢出, 所以設置足夠大的值

ini_set("memory_limit", "1024M"); // 根據電腦配置不夠繼續增加

第二步:設置PHPExcel儲存格緩存

儲存格緩存是將所需PHPExcel記憶體儲存格物件緩存到磁片、memcache、MemoryGZip等, 這樣讀取上會更耗時, 但可以降低記憶體的消耗。

PHPExcel_CachedObjectStorageFactory 這個類中提供了這幾個儲存格緩存

複製代碼

const cache_in_memory = 'Memory';

const cache_in_memory_gzip = 'MemoryGZip'; #將儲存格序列化後再進行Gzip壓縮, 然後保存在記憶體中

const cache_in_memory_serialized = 'MemorySerialized'; # 將儲存格資料序列化後保存在記憶體中

const cache_igbinary = 'Igbinary'; #存儲為緊密的二進位形式

const cache_to_discISAM = 'DiscISAM'; #緩存在臨時的磁片檔中, 速度可能會慢一些

const cache_to_apc = 'APC'; #Alternative PHP Cache可選PHP緩存

const cache_to_memcache = 'Memcache'; #保存在memcache中

const cache_to_phpTemp = 'PHPTemp'; #保存在php://temp

const cache_to_wincache = 'Wincache';

const cache_to_sqlite = 'SQLite';

const cache_to_sqlite3 = 'SQLite3';

複製代碼

每一個worksheet都會有一個獨立的緩存,

當一個worksheet產生實體時, 就會根據設置或配置的緩存方式來自動創建。 一旦你開始讀取一個檔或者你已經創建了第一個worksheet, 就不能在改變緩存的方式了。

MemorySerialized: 使用這種緩存方式, 儲存格會以序列化的方式保存在記憶體中, 這是降低記憶體使用率性能比較高的一種方案。

MemoryGZip: 與序列化的方式類似, 這種方法在序列化之後, 又進行gzip壓縮之後再放入記憶體中, 這回跟進一步降低記憶體的使用, 但是讀取和寫入時會有一些慢。

DiscISAM:當使用cache_to_discISAM這種方式時, 所有的儲存格將會保存在一個臨時的磁片檔中, 只把他們的在檔中的位置保存在PHP的記憶體中, 這會比任何一種緩存在記憶體中的方式都慢, 但是能顯著的降低記憶體的使用。

臨時磁片檔在腳本運行結束是會自動刪除。

PHPTemp: 類 似cache_to_discISAM這種方式, 使用cache_to_phpTemp時, 所有的儲存格會還存在php://temp I/O流中, 只把 他們的位置保存在PHP的記憶體中。 PHP的php://memory包裹器將資料保存在記憶體中, php://temp的行為類似, 但是當存儲的資料大小超 過記憶體限制時, 會將資料保存在暫存檔案中, 默認的大小是1MB, 但是你可以在初始化時修改它。 php://temp檔在腳本結束是會自動刪除。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示