PHP如何优雅从表格导入十万条数据甚至百万条数据呢?

一提到从表格导入,大都数的phper第一个想到的绝对是phpexcel这个插件,只要简单导入包,就可以获取表格内容读取到数组当中,然后为所欲为。
在这里插入图片描述

但是你的表格数据量达到几万行以上,phpexecel就开始罢工了,动不动就内存溢出。为啥呢?因为它是一次性把所有的数据全部读取到数组当中,能不爆炸吗?
此时,你大概会去代码中设置一下超时和可用内存。
在这里插入图片描述

你期望着它能有点作用,可是在等待了几秒后,等来的是报错,server error !
思来想去,phpexcel这条路算是走不通了。
于是你开始想到把excel换成csv呢,csv读取就不用第三方插件了,直接用

fgetcsv()

函数就能读取了。
那么恭喜你,成功走对了第一步。此时你的代码大概是这样的。
在这里插入图片描述

这样子,延长超时时间和扩大内存导入几万行数据似乎没有什么问题。
于是,你愉快了提交了测试。没过一会,测试妹子就过来质问:“你这导入也太久了,连导入进度都没有,多点几次就卡死了。”她还不客气地给你提了一个重要级别的bug。
于是,你又开始了长途漫漫优化之路。
在摸了好几分钟的后脑勺之后,你想到了以异步的方式导入,让导入程序在后台慢慢跑,前台上传完文件就直接提示数据导入成功。
可是怎么异步呢?在稍微思考之后,你决定这样做:
1、把表格的每行数据都推入到redis队列当中去
2、利用tp5自定义,写个名为import命令,作为消费者
3、写一个shell脚本,每秒从队列取数据消费,把数据写进mysql当中

这时候的代码是这样的:
在这里插入图片描述

import命令:
在这里插入图片描述

shell脚本:
在这里插入图片描述

设置到linux当中,
在这里插入图片描述

做完上面这些事情后,只需要再把导入数据库的逻辑,独立成消费者逻辑就大功告成了。
消费者逻辑:
在这里插入图片描述

做完这一切,你重新上传一个十几万的csv文件,内存也不会爆了,每秒都在插入数据,甚至可以设置个缓存来查看当前导入几条,两个字完美!!!
你信息十足地把bug提交给了测试妹子。
可没过多久,测试妹子又过来找你了,她说:“你这导入是可以导入了,但是每秒才导入一条,10万条不得导一天啊!”
你好像无法反驳。
于是,你灵机一动,这还不简单。
我每秒取100条消费不就完了,加上个for循环,1分钟就能导入6000条。于是,你又马不停蹄地改了代码:
在这里插入图片描述

改完后,这些测试妹子算是没话说了。
你还得意的说,觉得太慢?我多开几个进程,它可以更快!!!十万条数据,几秒钟的事情。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值