当前位置: 首页 > article >正文

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条。于是,你又马不停蹄地改了代码:
在这里插入图片描述

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


http://www.kler.cn/a/4891.html

相关文章:

  • React 元素渲染
  • 数位排序(2023寒假每日一题 9)
  • 【C#】List.ForEach方法
  • 做抖音起号的五件套是什么?抖音五件套怎么搭建?
  • VisualDCT用户手册
  • Synchronized锁升级之无锁和偏向锁
  • 【计算机视觉】COCO Caption数据集简单介绍
  • 032:cesium修改默认地图源,动态指定地图
  • Redis7笔记(正在更新中)
  • 【华为OD机试 2023最新 】 优选核酸检测点(C++)
  • 优思学院|平衡计分卡是什么?
  • 网站流量飙升背后:外贸企业谷歌SEO优化实战经验分享
  • Prometheus监控实战系列二十五: Thanos介绍
  • Linux 监控进程创建行为
  • Java设计模式-4、适配器模式
  • 【Hydro】龙格-库塔方法的公式推导
  • ChatGPT背后有哪些关键技术?CSIG企业行带你一探究竟
  • PyTorch 深度学习实战 | 基于生成式对抗网络生成动漫人物
  • JavaScript中bind的用法
  • STM32基于STM32CubeMX DMA + EXTI读取DS1307数据
  • 人大金仓数据库CentOS7安装简述