专栏首页小狼的世界phpExcel导出文件时内存溢出的问题

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”);

参考资料: 1、phpExcel how do I pass settings into class 2、How to fix memory getting exhausted with PHPExcel? 3、Lowest Memory Cache Method for PHPExcel

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PHP读取Excel文件内容

    项目需要读取Excel的内容,从百度搜索了下,主要有两个选择,第一个是PHPExcelReader,另外一个是PHPExcel。

    大江小浪
  • Python 3.6学习笔记(一)

    可以看到,注释以#开头,python的变量不需要任何前缀,行结束不需要结束符号,非常符合我们自然语言的阅读和书写习惯。当语句以:结尾时,缩紧的语句视为代码块。

    大江小浪
  • 几款Linux下的日志书写工具

    最近将工作环境切换到了Ubuntu 10.04 下,非常怀念原来的 Liver Writer,于是Google了一下,找找看Linux下是否有同样出色的离线博客...

    大江小浪
  • PhalApi-PHPExcel基于PhalApi的PHPExcel拓展

    PhalApi-PHPExcel基于PhalApi的PHPExcel拓展 ? 前言 在之前有提供过一个PhalApi-Excel拓展来提供导出,但是还是有一些不...

    喵了个咪233
  • PHP5.6读写excel表格文件操作示例

    本文实例讲述了PHP5.6读写excel表格文件操作。分享给大家供大家参考,具体如下:

    砸漏
  • 科大讯飞胡郁演讲实录:人工智能是这个时代最伟大的魔法师

    唯物按:9月份锤子的发布会结束后,科大讯飞股票应声上涨,成为罗永浩相声专场的最大赢家。 这其中有一些运气的成分,但在这种运气之前,讯飞已经做了很多铺垫工作。科大...

    AI研习社
  • 2005: [Noi2010]能量采集

    2005: [Noi2010]能量采集 Time Limit: 10 Sec  Memory Limit: 552 MB Submit: 1831  Solve...

    HansBug
  • (二)SpringBoot2.0基础篇- 静态资源的访问及Thymeleaf模板引擎的使用

    在应用系统开发的过程中,不可避免的需要使用静态资源(浏览器看的懂,他可以有变量,例:HTML页面,css样式文件,文本,属性文件,图片等);

  • document.compatMode的CSS1compat

    deepcc
  • [linux][redis]redis支持disable-thp了

    前言 前文《[linux][redis]bgsave引起的latency突刺问题分析》中记录了在执行bgsave的时候,因为fork子进程之后,会出现page ...

    皮振伟

扫码关注云+社区

领取腾讯云代金券