PHPExcel解決內存佔用過大問題-設置單元格對象緩存

PHPExcel解決內存佔用過大問題-設置單元格對象緩存

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

 

PHPExcel1.7.6官方文檔 寫道
PHPExcel uses an average of about 1k/cell in your worksheets, so large workbooks can quickly use up available memory. Cell caching provides a mechanism that allows PHPExcel to maintain the cell objects in a smaller size of memory, on disk, or in APC, memcache or Wincache, rather than in PHP memory. This allows you to reduce the memory usage for large workbooks, although at a cost of speed to access cell data.

 

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

 

如果還是不夠,打開php.ini改裏面的memory_limit

默認是128M調大點。

 

 

 

 

PHPExcel1.76.官方文檔 寫道
By default, PHPExcel still holds all cell objects in memory, but you can specify alternatives. To enable cell caching, you must call the PHPExcel_Settings::setCacheStorageMethod() method, passing in the caching method that you wish to use.

 

默認情況下,PHPExcel依然將單元格對象保存在內存中,但是你可以自定義。你可以使用PHPExcel_Settings::setCacheStorageMethod()方法,將緩存方式作爲參數傳遞給這個方法來設置緩存的方式。

 

 

Php代碼  

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory;  

PHPExcel_Settings::setCacheStorageMethod($cacheMethod);  

 

PHPExcel1.7.6官方文檔 寫道
setCacheStorageMethod() will return a boolean true on success, false on failure (for example if trying to cache to APC when APC is not enabled).

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

 

PHPExcel1.7.6官方文檔 寫道
A separate cache is maintained for each individual worksheet, and is automatically created when the worksheet is instantiated based on the caching method and settings that you have configured. You cannot change the configuration settings once you have started to read a workbook, or have created your first worksheet.

 

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

 

PHPExcel1.7.6官方文檔 寫道
Currently, the following caching methods are available.

 目前,有以下幾種緩存方式可以使用:

 

Php代碼  

PHPExcel_CachedObjectStorageFactory::cache_in_memory;  

PHPExcel1.7.6官方文檔 寫道
The default. If you don’t initialise any caching method, then this is the method that PHPExcel will use. Cell objects are maintained in PHP memory as at present.

 默認情況下,如果你不初始化任何緩存方式,PHPExcel將使用內存緩存的方式。

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

 

Php代碼  

PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;  

PHPExcle1.7.6官方文檔 寫道
Using this caching method, cells are held in PHP memory as an array of serialized objects, which reduces the memory footprint with minimal performance overhead.

 使用這種緩存方式,單元格會以序列化的方式保存在內存中,這是降低內存使用率性能比較高的一種方案。

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

 

Php代碼  

PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;  

PHPExcel1.7.6官方文檔 寫道
Like cache_in_memory_serialized, this method holds cells in PHP memory as an array of serialized objects, but gzipped to reduce the memory usage still further, although access to read or write a cell is slightly slower.

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

 

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

 

Php代碼  

PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;  

PHPExcel1.7.6官方文檔 寫道
When using cache_to_discISAM all cells are held in a temporary disk file, with only an index to their location in that file maintained in PHP memory. This is slower than any of the cache_in_memory methods, but significantly reduces the memory footprint.
The temporary disk file is automatically deleted when your script terminates.

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

 

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

 

Php代碼  

PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;  

PHPExcel1.7.6官方文檔 寫道
Like cache_to_discISAM, when using cache_to_phpTemp all cells are held in the php://temp I/O stream, with only an index to their location maintained in PHP memory. In PHP, the php://memory wrapper stores data in the memory: php://temp behaves similarly, but uses a temporary file for storing the data when a certain memory limit is reached. The default is 1 MB, but you can change this when initialising 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);  

PHPExcel1.7.6官方文檔 寫道
The php://temp file is automatically deleted when your script terminates.

php://temp文件在腳本結束是會自動刪除。

 

 

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

 

Php代碼  

PHPExcel_CachedObjectStorageFactory::cache_to_apc;  

PHPExcle1.7.6官方文檔 寫道
When using cache_to_apc, cell objects are maintained in APC with only an index maintained in PHP memory to identify that the cell exists. By default, an APC cache timeout of 600 seconds is used, which should be enough for most applications: although it is possible to change this when initialising 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);  

PHPExcel1.7.6官方文檔 寫道
When your script terminates all entries will be cleared from APC, regardless of the cacheTime value, so it cannot be used for persistent storage using this mechanism.

 當腳本運行結束時,所有的數據都會從APC中清楚(忽略緩存時間),不能使用此機制作爲持久緩存。

 

 

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

Php代碼  

PHPExcel_CachedObjectStorageFactory::cache_to_memcache  

PHPExcel1.7.6官方文檔 寫道
When using cache_to_memcache, cell objects are maintained in memcache with only an index maintained in PHP memory to identify that the cell exists.
By default, PHPExcel looks for a memcache server on localhost at port 11211. It also sets a memcache timeout limit of 600 seconds. If you are running memcache on a different server or port, then you can change these defaults when you initialise 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服務器輪詢的方式,比較遺憾。

PHPExcel1.7.6官方文檔 寫道
When your script terminates all entries will be cleared from memcache, regardless of the cacheTime value, so it cannot be used for persistent storage using this mechanism.

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

 

 

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

Php代碼  

PHPExcel_CachedObjectStorageFactory::cache_to_wincache;  

PHPExcel1.7.6官方文檔 寫道
When using cache_to_wincache, cell objects are maintained in Wincache with only an index maintained in PHP memory to identify that the cell exists. By default, a Wincache cache timeout of 600 seconds is used, which should be enough for most applications: although it is possible to change this when initialising 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官方文檔1.7.6 寫道
When your script terminates all entries will be cleared from Wincache, regardless of the cacheTime value, so it cannot be used for persistent storage using this mechanism.

 

 

PHPExcel還是比較強大的,最大的問題就是內存佔用的問題,PHPExcel啥時候能出一個輕量級的版本,不需要那麼多花哨的功能,只需要導出最普通的數據的版本就好了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章