PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

一分钟解决PHP大数据量(大于50万)导出到Excel

慕斯
慕斯 转载
2021-06-25 09:38:06 8158浏览

PHP中我们了解了那么多关于PHP的知识,不知道你们对运用PHP的技能掌握多少,我相信很大一部分人会了解但是不会运用知识,那么不急本篇文章就是带领大家更深刻的去运用PHP。

分析

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
	*
FROM
	table_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视频教程

声明:本文转载于:CSDN,如有侵犯,请联系admin@php.cn删除