php匯出excel出現500錯誤的解決方法:使用【PHPExcel_Settings::setCacheStorageMethod()】方法將快取方式作為參數傳遞給該方法來設定快取即可。
本文操作環境: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中文網其他相關文章!