本篇文章给大家带来的内容是关于phpexcel在导出文件时内存溢出的解决方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
在使用phpexcel导出文件时,经常会因为文件过大导致php内存溢出报错,为了解决这个问题,可以使用phpexcel提供的参数进行优化。这里说的excel文件过大并不一定是文件大小,更关键的在于文件内存放的数据和格式,如果数据很多,格式又比较丰富,那很容易会将php的内存耗尽。
资料2中指出,excel中一个单元格在不启用缓存的情况下大概占用内存是1k,一个8000行、31列的表格(248000个单元格)需要242mb内存。如果启用缓存,则会降到80mb,效果还是非常明显的。
使用中需要注意,phpexcel的内存优化参数并不在phpexcel对象中,需要在phpexcel实例化之前设置。
$cachemethod = phpexcel_cachedobjectstoragefactory::cache_to_phptemp;$cachesettings = array( 'memorycachesize' => '512mb');phpexcel_settings::setcachestoragemethod($cachemethod,$cachesettings);$oexcel = new phpexcel();
phpexcel_settings::setcachestoragemethod() 的几个参数将单元格数据序列化后保存在内存中
phpexcel_cachedobjectstoragefactory::cache_in_memory_serialized;
将单元格序列化后再进行gzip压缩,然后保存在内存中
phpexcel_cachedobjectstoragefactory::cache_in_memory_gzip;
缓存在临时的磁盘文件中,速度可能会慢一些
phpexcel_cachedobjectstoragefactory::cache_to_discisam;
保存在php://temp
phpexcel_cachedobjectstoragefactory::cache_to_phptemp;
保存在memcache中
$cachemethod = phpexcel_cachedobjectstoragefactory::cache_to_memcache; $cachesettings = array( 'memcacheserver' => 'localhost', 'memcacheport' => 11211, 'cachetime' => 600 ); phpexcel_settings::setcachestoragemethod($cachemethod, $cachesettings);
其它降低内存使用的方法如果不需要读取excel单元格格式,可以设置为只读取数据。
$objreader = phpexcel_iofactory::createreader('excel2007');$objreader->setreaddataonly(true);$objphpexcel = $objreader->load("test.xlsx”);
如果excel中有多个sheet,但是我们只需要读取其中几个,为了减少内存消耗,也可以设置。
$objreader = phpexcel_iofactory::createreader('excel2007');$objreader->setloadsheetsonly( array("worksheet1", "worksheet2") );$objphpexcel = $objreader->load("test.xlsx”);
如果只需要读取sheet中一定区域,也可以设置过滤器。
class myreadfilter implements phpexcel_reader_ireadfilter{ public function readcell($column, $row, $worksheetname = '') { // read title row and rows 20 - 30 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”);
最后个人用了下面这个方法
// 如果是因为特殊字符引起的,可以在load方法之前加上setreaddataonly(意思是忽略任何格式的信息)方法,就可以避免 $objreader->setreaddataonly(true);//只需要添加这个方法$objphpexcel = $objreader->load($uploadfilepath);
相关推荐:
phpexcel导出大量数据出现内存溢出错误解决办法
phpexcel 导出的excel件保存下载有关问题
以上就是phpexcel在导出文件时内存溢出的解决方法的详细内容。