pb 如何导出csv_百万级数据导出的各种坑,你遇到哪些?

cd1bdfee933c436fe09fac5a99a3a73c.gif

文章来自:https://www.jianshu.com/p/e762088f2fa1

作者:phper

点击加入:PHP自学中心技术交流微信群

商务合作: 请加微信(QQ):2230304070

技术交流微信群

我们在学习中单枪匹马,还不如一次短短的交流,你可以在别人吸取各种学习经验,学习方法以及学习技巧,所以,学习与交流少不了一个圈子,提升你的学习技能,请点击加技术群:PHP自学中心交流群     记得备注你会的一种PHP框架

7efd8ed443d7645dc486d77c146ae815.png

视频教程分享

更多视频教程请查看码农网IT技术教程

1 2020版-Swoole从入门到精通全套高级实战

链接:http://www.mano100.cn/thread-1640-1-1.html

2 2020版Node.JS入门到大神

链接:http://www.mano100.cn/thread-1641-1-1.html

3 TypeScript系统入门到项目实战

链接:http://www.mano100.cn/thread-1642-1-1.html

4 Node.js仿知乎服务端-深入理解RESTful API

链接:http://www.mano100.cn/thread-1644-1-1.html

5 Swoole实现IM即时通讯(QQ、微信通信)

链接:http://www.mano100.cn/thread-1643-1-1.html

精选文章正文

既然是导出数据,大伙们当然马上想到了excel格式了,多方便查看数据呀,然而用excel是有各种坑的。

目前PHP处理Excel的类库

我一直都在用PHPExcel ,不过现在官方不再维护了,所以新PHPer,建议还是要用PHPOffice/PhpSpreadsheet,看过文档的,其实都差不多。

一、PHP设置的坑

set_time_limit – 设置脚本最大执行时间:
此配置一般PHP默认是30秒,如果你是数据小的,可能就不会发现有该设置问题,但如果你数据达到了百万级导出,往往30秒是不够的,因此你需要在你的脚本中添加 set_time_limit(0),让该脚本没有执行时间现在

memory_limit – PHP的内存限定:
此配置一般php默认是128M,如果之前做过小数据的朋友可能也会动过这个配置就能解决许多问题,或许有人想,你大数据也把这个调大不就行了吗?那么真的是too young too native了,你本地能设置1G或者无限制或许真的没问题,但是正式场,你这么搞迟早会出事的,一个PHP程序占那么大的内存的空间,如果你叫你公司运维帮忙调一下配置,估计运维一定很不情愿,服务器硬件这么搞也是太奢侈了。所以说,我们要尽量避免调大该设置。

二、exce的l坑

表数据限制:
1、Excel 2003及以下的版本。一张表最大支持65536行数据,256列。
2、Excel 2007-2010版本。一张表最大支持1048576行,16384列。

也就是说你想几百万条轻轻松松一次性导入一张EXCEL表是不行的,你起码需要进行数据分割,保证数据不能超过104W一张表。

PHPexcel内存溢出:
既然数据限制在104W,那么数据分割就数据分割呗,于是你尝试50W一次导入表,然而PHPexcel内部有函数报内存溢出错误,然后你就不断的调小数据量,直到5W一次导入你都会发现有内存溢出错误。这是为什么呢,虽然你分割数据来导入多个数据表,但是最后PHPexcel内部还是一次性把所有表数据放进一个变量中来创建文件……额,这几百万数据一个变量存储,你想内存不溢出,还真有点困难。

PHPExcel也有解决方案:PHPExcel_Settings::setCacheStorageMethod方法更改缓冲方式来减小内存的使用

三、csv坑

EXCEL这么麻烦,试着用csv文件储存,既不限制数量,还能直接用EXCEL来查看,又能以后把文件导入数据库,一举几得岂不是美哉?想法是好,CSV也有坑哦!

输出buffer过多:
当你用PHP原生函数putcsv()其实就使用到了输出缓存buffer,如果你把几百万的数据一直用这个函数输出,会导致输出缓存太大而报错的,因此我们每隔一定量的时候,必须进行将输出缓存中的内容取出来,设置为等待输出状态。

具体操作是:

1、ob_flush();
2、flush();

具体说明介绍:PHP flush()与ob_flush()的区别详解

EXCEL查看CSV文件数量限制:
大多数人看csv文件都是直接用EXCEL打开的。额,这不就是回到EXCEL坑中了吗?EXCEL有数据显示限制呀,你几百万数据只给你看104W而已。

四、总结做法

分析完上面那些坑,那么我们的解决方案来了,假设数据量是几百万。

1、那么我们要从数据库中读取要进行数据量分批读取,以防变量内存溢出,

2、我们选择数据保存文件格式是csv文件,以方便导出之后的阅读、导入数据库等操作。

3、以防不方便excel读取csv文件,我们需要104W之前就得把数据分割进行多个csv文件保存

4、多个csv文件输出给用户下载是不友好的,我们还需要把多个csv文件进行压缩,最后提供给一个ZIP格式的压缩包给用户下载就好。

代码:

//导出说明:因为EXCEL单表只能显示104W数据,同时使用PHPEXCEL容易因为数据量太大而导致占用内存过大,

五、相关视频教程

给大家分享几节【PHPExcel+PHP开发框架TP5实现百万级报表数据导入】的课程,做做笔记,学习一下!

目录如下:

1 课程知识点介绍、MVC原理01

2 单一入口文件讲解02

3 PHPExcel原理03

4 控制器及获取表单04

5 数据处理05

6 遍历数据06

7 百万级数据导入方案07

8 mysql性能优化方案08

9 性能优化方向09

详情可查看

链接:http://www.mano100.cn/thread-1645-1-1.html

获取教程

本公众号里回复:425537 

以上是本文的全部内容,希望对大家的学习有帮助,也希望大家多多支持 php自学中心 ,学习与交流少不了一个圈子,点击加技术群:PHP自学中心交流②群

5efba63246f0a2c98bbba5e8694796e8.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值