首頁  >  文章  >  後端開發  >  php匯出excel出現500錯誤怎麼辦

php匯出excel出現500錯誤怎麼辦

王林
王林原創
2021-09-27 15:16:083508瀏覽

php匯出excel出現500錯誤的解決方法:使用【PHPExcel_Settings::setCacheStorageMethod()】方法將快取方式作為參數傳遞給該方法來設定快取即可。

php匯出excel出現500錯誤怎麼辦

本文操作環境:windows10系統、php 7、thinkpad t480電腦。

想必很多小夥伴都遇到過導出excel的問題,也許我們平常在使用phpexcel類別時覺得很方便。但你會發現在導出大量資料的時候可就沒那麼簡單了,往往會導出時會伴隨著一些超時或記憶體溢出的問題。下面我們就來一起看看解決方法。

PHPExcel是一個很強大的處理Excel的PHP開源類,但是很大的一個問題就是它佔用內存太大,從1.7.3開始,它支持設置cell的緩存方式,但是推薦使用目前穩定的版本1.7.6,因為先前的版本都會不同程度的存在bug。

PHPExcel 平均下來使用1k/單元格的內存,因此大的文檔會導致內存消耗的也很快。單元格快取機制能夠允許PHPExcel將記憶體中的小的單元格物件快取在磁碟或 APC,memcache或Wincache中,儘管會在讀取資料上消耗一些時間,但是能夠幫助你降低記憶體的消耗。

預設情況下,PHPExcel依然將單元格物件保存在記憶體中,但是你可以自訂。你可以使用PHPExcel_Settings::setCacheStorageMethod()方法,將快取方式當作參數傳遞給這個方法來設定快取的方式。

Php程式碼:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);

setCacheStorageMethod()方法會傳回一個BOOL型變數用來表示是否成功設定(比如,如果APC不能使用的時候,你設定使用APC緩存,將會傳回false)

每一個worksheet都會有一個獨立的緩存,當一個worksheet實例化時,就會根據設定或配置的快取方式來自動建立。一旦你開始讀取一個檔案或是你已經創建了第一個worksheet,就不能在改變快取的方式了。

目前,有以下幾種快取方式可以使用:

Php程式碼:

PHPExcel_CachedObjectStorageFactory::cache_in_memory;

預設情況下,如果你不初始化任何快取方式,PHPExcel將使用記憶體緩存的方式。

============================================== ===

Php程式碼:

PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;

使用這種快取方式,單元格會以序列化的方式保存在記憶體中,這是降低記憶體使用率效能比較高的一種方案。

============================================== ===

Php程式碼:

PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;

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

============================================== ===============

Php代碼:

PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;

當使用cache_to_discISAM這種方式時,所有的單元格將會保存在一個暫時的磁碟檔案中,只把他們的在檔案中的位置保存在PHP的記憶體中,這會比任何一種快取在記憶體中的方式都慢,但是能顯著的降低記憶體的使用。臨時磁碟檔案在腳本運行結束是會自動刪除。

============================================== ===============

Php程式碼:

PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;

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

Php程式碼:

$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
$cacheSettings = array(’memoryCacheSize’ => ’8MB’ );
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
php://temp文件在脚本结束是会自动删除。

======================== ==================================

Php代碼:

PHPExcel_CachedObjectStorageFactory::cache_to_apc;

當使用cach_to_apc時,單元格保存在APC中,只在記憶體中保存索引。 APC快取預設逾時時間時600秒,對絕大多數應用是足夠了,當然你也可以在初始化時進行修改:

Php代碼:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_APC;
$cacheSettings = array(’cacheTime’ => 600 );
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

當腳本運行結束時,所有的資料都會從APC中清除(忽略快取時間),不能使用此機製作為持久快取。

============================================== ===============

Php程式碼:

PHPExcel_CachedObjectStorageFactory::cache_to_memcache

使用cache_to_memory時,單元格物件保存在memcache中,只在記憶體中保存索引。預設情況下,PHPExcel會在localhost和連接埠11211尋找memcache服務,逾時時間600秒,如果你在其他伺服器或其他連接埠執行memcache服務,可以在初始化時進行修改:

Php程式碼:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache;
$cacheSettings = array( ’memcacheServer’  => ’localhost’,
‘memcachePort’    => 11211,
‘cacheTime’       => 600
);
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

從初始化設定的形式來看,MS還不支援多台memcache伺服器輪詢的方式,比較遺憾。

當腳本結束時,所有的資料都會從memcache清空(忽略快取時間),不能使用該機制進行持久儲存。

============================================== ===============

Php程式碼:

PHPExcel_CachedObjectStorageFactory::cache_to_wincache;

使用cache_towincache方式,单元格对象会保存在Wincache中,只在内存中保存索引,默认情况下Wincache过期时间为600秒,对绝大多数应用是足够了,当然也可以在初始化时修改:

Php代码:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_wincache;
$cacheSettings = array(’cacheTime’ => 600);
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

PHPExcel还是比较强大的,最大的问题就是内存占用的问题,PHPExcel啥时候能出一个轻量级的版本,不需要那么多花哨的功能,只需要导出最普通的数据的版本就好了!

推荐学习:php培训

以上是php匯出excel出現500錯誤怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn