- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- php導出excel出現500錯誤的解決方法
小編給大家分享一下php導出excel出現500錯誤的解決方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
php導出excel出現500錯誤的解決方法:使用【PHPExcel_Settings::setCacheStorageMethod()】方法將緩存方式作為參數傳遞給該方法來(lái)設置緩存即可。
本文操作環(huán)境:windows10系統、php 7、thinkpad t480電腦。
想必很多小伙伴都遇到過(guò)導出excel的問(wèn)題,也許我們平時(shí)在使用phpexcel類(lèi)時(shí)覺(jué)得很方便。但是你會(huì )發(fā)現在導出大量數據的時(shí)候可就沒(méi)那么簡(jiǎn)單了,往往會(huì )導出時(shí)會(huì )伴隨著(zhù)一些超時(shí)或者內存溢出的問(wèn)題。下面我們就來(lái)一起看看解決方法。
PHPExcel是一個(gè)很強大的處理Excel的PHP開(kāi)源類(lèi),但是很大的一個(gè)問(wèn)題就是它占用內存太大,從1.7.3開(kāi)始,它支持設置cell的緩存方式,但是推薦使用目前穩定的版本1.7.6,因為之前的版本都會(huì )不同程度的存在bug。
PHPExcel 平均下來(lái)使用1k/單元格的內存,因此大的文檔會(huì )導致內存消耗的也很快。單元格緩存機制能夠允許PHPExcel將內存中的小的單元格對象緩存在磁盤(pán)或者 APC,memcache或者Wincache中,盡管會(huì )在讀取數據上消耗一些時(shí)間,但是能夠幫助你降低內存的消耗。
默認情況下,PHPExcel依然將單元格對象保存在內存中,但是你可以自定義。你可以使用PHPExcel_Settings::setCacheStorageMethod()方法,將緩存方式作為參數傳遞給這個(gè)方法來(lái)設置緩存的方式。
Php代碼:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory; PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
setCacheStorageMethod()方法會(huì )返回一個(gè)BOOL型變量用于表示是否成功設置(比如,如果APC不能使用的時(shí)候,你設置使用APC緩存,將會(huì )返回false)
每一個(gè)worksheet都會(huì )有一個(gè)獨立的緩存,當一個(gè)worksheet實(shí)例化時(shí),就會(huì )根據設置或配置的緩存方式來(lái)自動(dòng)創(chuàng )建。一旦你開(kāi)始讀取一個(gè)文件或者你已經(jīng)創(chuàng )建了第一個(gè)worksheet,就不能在改變緩存的方式了。
目前,有以下幾種緩存方式可以使用:
Php代碼:
PHPExcel_CachedObjectStorageFactory::cache_in_memory;
默認情況下,如果你不初始化任何緩存方式,PHPExcel將使用內存緩存的方式。
===============================================
Php代碼:
PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;
使用這種緩存方式,單元格會(huì )以序列化的方式保存在內存中,這是降低內存使用率性能比較高的一種方案。
===============================================
Php代碼:
PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
與序列化的方式類(lèi)似,這種方法在序列化之后,又進(jìn)行g(shù)zip壓縮之后再放入內存中,這會(huì )更進(jìn)一步降低內存的使用,但是讀取和寫(xiě)入時(shí)會(huì )有一些慢。
===========================================================
Php代碼:
PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
當使用cache_to_discISAM這種方式時(shí),所有的單元格將會(huì )保存在一個(gè)臨時(shí)的磁盤(pán)文件中,只把他們的在文件中的位置保存在PHP的內存中,這會(huì )比任何一種緩存在內存中的方式都慢,但是能顯著(zhù)的降低內存的使用。臨時(shí)磁盤(pán)文件在腳本運行結束是會(huì )自動(dòng)刪除。
===========================================================
Php代碼:
PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
類(lèi) 似cache_to_discISAM這種方式,使用cache_to_phpTemp時(shí),所有的單元格會(huì )還存在php://temp I/O流中,只把 他們的位置保存在PHP的內存中。PHP的php://memory包裹器將數據保存在內存中,php://temp的行為類(lèi)似,但是當存儲的數據大小超 過(guò)內存限制時(shí),會(huì )將數據保存在臨時(shí)文件中,默認的大小是1MB,但是你可以在初始化時(shí)修改它:
Php代碼:
$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp; $cacheSettings = array(’memoryCacheSize’ => ’8MB’ ); PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); php://temp文件在腳本結束是會(huì )自動(dòng)刪除。
===========================================================
Php代碼:
PHPExcel_CachedObjectStorageFactory::cache_to_apc;
當使用cach_to_apc時(shí),單元格保存在A(yíng)PC中,只在內存中保存索引。APC緩存默認超時(shí)時(shí)間時(shí)600秒,對絕大多數應用是足夠了,當然你也可以在初始化時(shí)進(jìn)行修改:
Php代碼:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_APC; $cacheSettings = array(’cacheTime’ => 600 ); PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
當腳本運行結束時(shí),所有的數據都會(huì )從APC中清除(忽略緩存時(shí)間),不能使用此機制作為持久緩存。
===========================================================
Php代碼:
PHPExcel_CachedObjectStorageFactory::cache_to_memcache
使 用cache_to_memory時(shí),單元格對象保存在memcache中,只在內存中保存索引。默認情況下,PHPExcel會(huì )在localhost和 端口11211尋找memcache服務(wù),超時(shí)時(shí)間600秒,如果你在其他或其他端口運行memcache服務(wù),可以在初始化時(shí)進(jìn)行修改:
Php代碼:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache; $cacheSettings = array( ’memcacheServer’ => ’localhost’, ‘memcachePort’ => 11211, ‘cacheTime’ => 600 ); PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
從初始化設置的形式上看,MS還不支持多臺memcache服務(wù)器輪詢(xún)的方式,比較遺憾。
當腳本結束時(shí),所有的數據都會(huì )從memcache清空(忽略緩存時(shí)間),不能使用該機制進(jìn)行持久存儲。
===========================================================
Php代碼:
PHPExcel_CachedObjectStorageFactory::cache_to_wincache;
使用cache_towincache方式,單元格對象會(huì )保存在Wincache中,只在內存中保存索引,默認情況下Wincache過(guò)期時(shí)間為600秒,對絕大多數應用是足夠了,當然也可以在初始化時(shí)修改:
Php代碼:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_wincache; $cacheSettings = array(’cacheTime’ => 600); PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
PHPExcel還是比較強大的,最大的問(wèn)題就是內存占用的問(wèn)題,PHPExcel啥時(shí)候能出一個(gè)輕量級的版本,不需要那么多花哨的功能,只需要導出最普通的數據的版本就好了!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站