PHP大数据量(大于50万)导出到Excel解决方案
综述
最近在工作中遇到这样一个问题,公司项目要求订单有导出功能,以前虽然也使用PHPExcel做过几个导出功能,但是这次所需导出的数量巨大,因此在开发中遇到一些导出的坑,在此进行总结记录一下。
吐槽
首先,我们可以肯定这个需求太XX(手动和谐)了,这么大的数据量让谁看这去分析啊?一般的Excel数据都是给市场、财务的的非技术部门使用的,所以,我认为应该把思路首先放到为什么需要导出这类数据上,根据需求来解决问题。毕竟不是甲方(出钱的),改变不了需求就只能老老实实的实现具体功能了。请看下面解决方案。
分析
1、工具
首先明确我们需要导出的数量50W+,其次我们使用过都知道Excel2003版最大行数是65535行,Excel2007版的行数(1048576行)才能达到我们的要求,所以我们需要使用Excel的版本必须为2007版及以上。
2、类库
目前最常用的PHP处理Excel的类库是PHPExcel(经实例测试导出1w条数据,再加上各种数据判断处理我用了5-8分钟);我在网上还查到一款叫PHPOffice(这个我没用过,大家可以尝试一下,据说效率比PHPExcel要好,等下次再写篇博文介绍一下);还有一个fputcsv(),导出的是csv格式文件,也可以用Excel文件打开。
各种坑
1、超时
这个是直接的,请求超时。在这个多的数据请求处理下,超市非常常见,这时我们需要修改PHP的配置:set_time_limit(0)。
2、溢出
我们一次性的把所有数据从数据库取出填充到内存中,一下不光内存存储不够,并且如果服务器CPU配置不高的话使用率一下也能达到100%,会造成服务器卡负载。关于溢出我们也需要修改PHP的配置:ini_set('memory_limit', '1024M')。
解决方案
1、使用PHPExcel导出
使用此种方案一下导出50w+的数据体验非常的不好,经测试之后是虽说是可行的,服务器上也可以导出,就是时间会慢一些,而且会是一直下载状态。如果使用php类库,建议将php升级到最新的php7版本节省内存,且计算速度要快
2、使用csv导出
如果不是用php类库,那么fputcsv()是最佳方式,这种方式要比PHPExcel好很多;因为csv文件较小,csv文件数据可存放数量可大可小,csv生成不占用大量CPU和时间,而Excel的生成时间随着文件数据量的增加成而所需时间越多。
3、理想方案
将数据按照某种条件进行分割,减少导出的数据量,例如按照日期进行导出,可一周导出一次或者一天导出一次,数据分割肯定是必须的步骤,防止内存溢出,运行超时;
进行算法优化,在数据循环时,减少嵌套循环,生成csv或者Excel的数据对象时,一次成型,减少数据库查询次数,如果需要用到其他数据请提前生成相应数据结构的数据。
4、最快方案
将需求交给运维,直接运行sql语句进行导出:
SELECT*
FROMtable_name
INTO OUTFILE 'F:/test.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
运行此语句可能出现如下错误:
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
这个是由于Mysql的配置权限问题,可以运行SHOW VARIABLES LIKE '%secure%';查看 secure-file-priv 当前的值是什么,NULL就代表禁止导出,所以需要设置一下。在Mysql安装路径下的my.ini文件,修改设置一下路径,没有的话添加上此配置:
secure_file_priv=F:/
50w+的数据你会发现很快就导出了。你也可以写此此语句,知道此文件在服务器上的路径,进行打包下载即可。
PHP大数据量(大于50万)导出到Excel解决方案相关推荐
- el-table 大数据量渲染,页面卡顿的解决方案
原文: el-table大数据量渲染卡顿的解决方案 描述: 当el-table的数据有成千上万条,且在同一页全部展示,此时页面渲染的dom太多可能造成页面卡顿 原因: 因为数据量过多导致浏览器渲染过多 ...
- 数据库大数据量、高并发、高可用解决方案!
数据库性能瓶颈 对于一些互联网项目来说,企业为节省成本,一般会考虑将所有的数据都存储在一个数据库中,这个时候我们只需要考虑数据库优化.SQL优化.数据缓存.限流,消息队列.服务器性能等问题. 阿里巴巴 ...
- 大数据量高效导入数据库(以excel导入sqlserver为例)
本人文章陆续转向本人微信公账号发布 公众号:搬砖码农SmallNNN,期望您要是搬砖码农,一起学习探讨,祝您阅读愉快. 最近正在做一个项目,要把excel中的数据导入到sqlserver数据库中,首先 ...
- java 导出excel 大数据量 报错_java导出excel
上面导出PDF和EXCEL的问题是图片路径出错!!! 数据库中存存的图片路径是"../dishpic/722f464f-3883-42aa-901f-21706da9c582.png&quo ...
- Linux下MySQL数据库的备份与还原,mysql快速导入导出数据库实例演示,解决mysql大数据量数据库导出慢的问题
MySQL 数据库的备份与还原 第一章:数据库的导入与导出 ① 数据库的导出 ② 大数据量下 mysqldump 的导出优化 ③ 数据库的导出 第一章:数据库的导入与导出 ① 数据库的导出 需要用到 ...
- 大数据导出excel大小限制_EXCEL大数据量导出的解决方案
将web页面上显示的报表导出到excel文件里是一种很常见的需求.润乾报表的类excel模型,支持excel文件数据无失真的导入导出,使用起来非常的方便.然而,当数据量较大的情况下,excel本身的支 ...
- MYSQL数据库导入大数据量sql文件失败的解决方案
最快办法:执行下方语句,单次有效. SET GLOBAL max_allowed_packet=30*1024*1024 如果想彻底更改,在安装mysql的文件夹下找到my.ini 文件,在文件末尾添 ...
- EasyExcel 低内存导出大数据量的Excel方案探索 50万行 50列 (附:实现代码)
文章目录 1.前言 2.准备工作 3.导出测试 3.1.单次查询.全量导出 3.2. 多次查询,多个文件,单次写入 3.3.多次查询,多个文件,多次写入 3.4.多线程导出探索 3.5.文件打包成ZI ...
- easyexcel导出excel,大数据量100万以内分页查询zip格式导出
easyexcel导出excel,大数据量100万以内分页查询zip格式导出 准备工作 整体思路 controller层 service层 mapper层 VO 表结构 测试 备注 easyExcel ...
最新文章
- 递推DP UVA 1366 Martian Mining
- 《ASP.NET MVC3高级编程》学习笔记2
- linux 解析pdf下载工具,Linux高级系统级性能分析工具-perf.pdf
- EAE:自编码器 + BN + 最大熵 = 生成模型
- hadoop-0.20.2安装配置
- windows 远程执行 cmd 命令的 9 种方法
- (WWWWWWWWWW)codevs 3305 水果姐逛水果街Ⅱ
- 山寨AirPods2020年出货量已达6亿副,是正版7倍,网友:怪不得满大街都是
- 《蜗居》经典台词100句
- 使用powershell Client进行有效dy
- 华为消费者业务公布2017上半年智能手机收入暴涨
- Google Cloud Speech-to-Text / Text-to-Speech API 试用
- 最强量子计算机争霸:谷歌和IBM,谁是真正赢家?
- python对股票的基本面进行分析_python菜鸟学员如何获取沪深股票基本面数据
- Springboot尝试写一个DNF装备计算器(后端--1)
- 手机扫码,影像报告一手掌握|“云胶片”服务在医院大受欢迎...
- Vue中加载mapv和mapvgl
- 半导体激光器发光原理及工作原理
- latex导数_latex 中怎样打求导符号du/dx怎么打
- 也谈《火车运煤》问题