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文件在脚本结束是会自动删除。