PHPExcel 是一个php措辞读取导出数据、导入天生Excel的类库,利用起来非常方便,但有时会碰着以些问题,比如导出的数据超时,内存溢出等。

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

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

php导出大数据分享PHPExcel年夜数据的导出解决计划 GraphQL

能碰着这样的问题一样平常都是由于数据量大导致

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