phpExcel在导出文件时内存溢出的解决方法
来源:不言
发布时间:2018-12-13 15:39:31
阅读量:876
本篇文章给大家带来的内容是关于phpExcel在导出文件时内存溢出的解决方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
在使用PHPExcel导出文件时,经常会因为文件过大导致PHP内存溢出报错,为了解决这个问题,可以使用PHPExcel提供的参数进行优化。这里说的Excel文件过大并不一定是文件大小,更关键的在于文件内存放的数据和格式,如果数据很多,格式又比较丰富,那很容易会将PHP的内存耗尽。
资料2中指出,Excel中一个单元格在不启用缓存的情况下大概占用内存是1K,一个8000行、31列的表格(248000个单元格)需要242MB内存。如果启用缓存,则会降到80MB,效果还是非常明显的。
使用中需要注意,PHPExcel的内存优化参数并不在PHPExcel对象中,需要在PHPExcel实例化之前设置。
1 2 3 4 5 | $cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array ( 'memoryCacheSize' => '512MB' );
PHPExcel_Settings::setCacheStorageMethod( $cacheMethod , $cacheSettings );
$oExcel = new PHPExcel();
|
PHPExcel_Settings::setCacheStorageMethod() 的几个参数
将单元格数据序列化后保存在内存中
1 | PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;
|
将单元格序列化后再进行Gzip压缩,然后保存在内存中
1 | PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
|
缓存在临时的磁盘文件中,速度可能会慢一些
1 | PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
|
保存在php://temp
1 | PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
|
保存在memcache中
1 2 3 4 5 6 | $cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache;
$cacheSettings = array ( 'memcacheServer' => 'localhost' ,
'memcachePort' => 11211,
'cacheTime' => 600
);
PHPExcel_Settings::setCacheStorageMethod( $cacheMethod , $cacheSettings );
|
其它降低内存使用的方法
如果不需要读取Excel单元格格式,可以设置为只读取数据。
1 2 3 | $objReader = PHPExcel_IOFactory::createReader( 'Excel2007' );
$objReader ->setReadDataOnly(true);
$objPHPExcel = $objReader ->load("test.xlsx”);
|
如果Excel中有多个Sheet,但是我们只需要读取其中几个,为了减少内存消耗,也可以设置。
1 2 3 | $objReader = PHPExcel_IOFactory::createReader( 'Excel2007' );
$objReader ->setLoadSheetsOnly( array ( "Worksheet1" , "Worksheet2" ) );
$objPHPExcel = $objReader ->load("test.xlsx”);
|
如果只需要读取Sheet中一定区域,也可以设置过滤器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class MyReadFilter implements PHPExcel_Reader_IReadFilter
{
public function readCell( $column , $row , $worksheetName = '' ) {
if ( $row == 1 || ( $row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$objReader = PHPExcel_IOFactory::createReader( 'Excel2007' );
$objReader ->setReadFilter( new MyReadFilter() );
$objPHPExcel = $objReader ->load("test.xlsx”);
|
最后个人用了下面这个方法
1 2 3 | $objReader->setReadDataOnly( true );
$objPHPExcel = $objReader->load($uploadFilePath);
|