phpexcel 导出+导入大量数据造成曾内存溢出

导入或者导出1000+左右基本还勉强可以

但是数量超过5000+的时候,就直接崩了,无响应……

这个应该如何解决,php.ini已经修改了配置,还是不行,还是应该修改缓存位置?

阅读 11.2k
9 个回答

执行的时候set_time_limit(0);
php.ini memory_limit = 1024M
我本地试了下,7万行,文件15M,可以打印的出来。
你php服务重启下试试
然后就是先试试看,是哪里出问题,如导入读取出问题,还是执行mysql出问题

减少内存占用方法:

设置缓存

$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
$cacheSettings = array( ' memoryCacheSize ' => '8MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

只读取指定的sheet

$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setLoadSheetsOnly( array("Worksheet1", "Worksheet2") );
$objPHPExcel = $objReader->load("test.xlsx");

如果还不够,那只能调整php内存上限了

可以做按行读取数据,导入数据库,在清理内存空间。导出做分页。

clipboard.png
按行读取 比较靠谱 修改php.ini并不推荐,卡顿

(1) phpexcel在处理大数据量时很弱鸡,用php自带的fputcsv()
(2) 数据库拿数据时候不要一下获取整个结果集,否则数据量大会报内存溢出,用迭代器方式拿数据

我的一个测试例子:
从数据库获取15万条商品记录导入表格文件中, 文件大小有41.9M, 执行时间为6.91秒

spout

用这个扩展试试spout

命令行执行:)

setActiveSheetIndex($i),做分页

建议用csv把 phpexcel 实在是太耗内存了
goodby/csv 这个拓展就挺好的 功能很全

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题