分享:PHPExcel大数据的导出解决方案

Elvis技术小屋 2018-01-15

PHPExcel 大数据的导出

PHPExcel 是一个php语言读取导出数据、导入生成Excel的类库,使用起来非常方便,但有时会遇到以些问题,比如导出的数据超时,内存溢出等。

下面我们来说说这些问题和解决办法。

PHPExcel 版本:@version 1.8.0, 2014-03-02

能遇到这样的问题一般都是因为数据量大导致

1.PHPExcel 报错

报错提示:

'break' not in the 'loop' or 'switch' context

严格的讲这个不是PHPExcel的错误,是PHP版本的问题,大于PHP5.6以后,“break”必须要在循环体内执行(for ,foreach, while, switch)

此处无循环,解决办法:注释掉break;

2.超时

提示:

Maximum execution time of 30 seconds exceeded

数据量过大,php执行超过30秒后就会报这样的信息

解决办法:

可修改php.ini 或直接在执行页面中添加

set_time_limit(0);

这样就设置了php的执行超时

3.内存溢出

超时解决好之后,等待了好几十秒后又来了个错误:

Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)

内存不足呀!

解决内存溢出我们分两步走,

第一步:设置memory_limit

默认情况memory_limit 大小为100MB,当所需内存大于100MB就会溢出,所以设置足够大的值

ini_set("memory_limit", "1024M"); // 根据电脑配置不够继续增加

第二步:设置PHPExcel单元格缓存

单元格缓存是将所需PHPExcel内存单元格对象缓存到磁盘、memcache、MemoryGZip等,这样读取上会更耗时,但可以降低内存的消耗。

PHPExcel_CachedObjectStorageFactory 这个类中提供了这几个单元格缓存

复制代码

const cache_in_memory = 'Memory';

const cache_in_memory_gzip = 'MemoryGZip'; #将单元格序列化后再进行Gzip压缩,然后保存在内存中

const cache_in_memory_serialized = 'MemorySerialized'; # 将单元格数据序列化后保存在内存中

const cache_igbinary = 'Igbinary'; #存储为紧密的二进制形式

const cache_to_discISAM = 'DiscISAM'; #缓存在临时的磁盘文件中,速度可能会慢一些

const cache_to_apc = 'APC'; #Alternative PHP Cache可选PHP缓存

const cache_to_memcache = 'Memcache'; #保存在memcache中

const cache_to_phpTemp = 'PHPTemp'; #保存在php://temp

const cache_to_wincache = 'Wincache';

const cache_to_sqlite = 'SQLite';

const cache_to_sqlite3 = 'SQLite3';

复制代码

每一个worksheet都会有一个独立的缓存,当一个worksheet实例化时,就会根据设置或配置的缓存方式来自动创建。一旦你开始读取一个文件或者你已经创建了第一个worksheet,就不能在改变缓存的方式了。

MemorySerialized: 使用这种缓存方式,单元格会以序列化的方式保存在内存中,这是降低内存使用率性能比较高的一种方案。

MemoryGZip: 与序列化的方式类似,这种方法在序列化之后,又进行gzip压缩之后再放入内存中,这回跟进一步降低内存的使用,但是读取和写入时会有一些慢。

DiscISAM:当使用cache_to_discISAM这种方式时,所有的单元格将会保存在一个临时的磁盘文件中,只把他们的在文件中的位置保存在PHP的内存中,这会比任何一种缓存在内存中的方式都慢,但是能显著的降低内存的使用。临时磁盘文件在脚本运行结束是会自动删除。

PHPTemp: 类 似cache_to_discISAM这种方式,使用cache_to_phpTemp时,所有的单元格会还存在php://temp I/O流中,只把 他们的位置保存在PHP的内存中。PHP的php://memory包裹器将数据保存在内存中,php://temp的行为类似,但是当存储的数据大小超 过内存限制时,会将数据保存在临时文件中,默认的大小是1MB,但是你可以在初始化时修改它。php://temp文件在脚本结束是会自动删除。

相关推荐