用Laravel轻松处理千万级数据的方法实现


Posted in PHP onDecember 25, 2020

在Laravel中使用cursor来查询并处理数据 (轻松处理千万级的数据)

事发现场

最近在项目中遇到内存不足的问题, 测试环境中的PHP内存只有64M,在导出的时候, 数据量比较大,这个时候会出现内存溢出的错误;

如何解决

目前想到两种方法:

  1. 调整php.ini文件中memory_limit配置项; 或者在调用方法中调整内存大小ini_set('memory_limit', "").
  2. 使用Laravel的Lazy Collection.

考虑到修改配置文件的影响范围过大, 以及对导出的实时性要求不是很高, 所以我们选择了第二种方法.

Lazy Collection

如何使用Lazy Collection? 很简单, 将查询构建器链末尾的get()更改为cursor()就好了 !

cursor ( )

cursor的原理

cursor的实现使用了 yield 关键字, yield关键字是生成器函数的核心, 它的调用形式跟return很像, 不同之处在于return会返回值并且终止函数执行, 而yield会返回值给循环调用生成器的代码并且只是暂停生成器函数.

cursor()的代码如下

/** 
  * 
  Get a generator for the given query. 
  * 
  * @return Generator
  */
 public function cursor() {
  foreach ($this->applyScopes()->query->cursor() as $record) { 
    yield $this->newModelInstance()->newFromBuilder($record);
  } 
 }

由于使用了yield关键字, 在循环cursor生成器的时候,可以渐进式的处理数据,即使在内存很小的情况下,也可以轻松处理千万级的数据! 真的是非常方便哦!

到此这篇关于用Laravel轻松处理千万级数据的方法实现的文章就介绍到这了,更多相关Laravel 处理千万级数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
PHPMailer邮件类利用smtp.163.com发送邮件方法
Sep 11 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
Jan 12 PHP
PHP错误提示的关闭方法详解
Jun 23 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
ecshop实现smtp发送邮件
Feb 03 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 PHP
PHP中的随机性 你觉得自己幸运吗?
Jan 22 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
Sep 11 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
PHP匿名函数(闭包函数)详解
Mar 22 PHP
PHP 7.4 新语法之箭头函数实例详解
May 09 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 PHP
PHP操作Redis常用命令的实例详解
Dec 23 #PHP
php中yii框架实例用法
Dec 22 #PHP
php swoft框架实例用法
Dec 22 #PHP
PHP变量的作用范围实例讲解
Dec 22 #PHP
PHP设计模式之命令模式示例详解
Dec 20 #PHP
如何重写Laravel异常处理类详解
Dec 20 #PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
Dec 16 #PHP
You might like
PHP ajax 异步执行不等待执行结果的处理方法
2015/05/27 PHP
javascript Object与Function使用
2010/01/11 Javascript
js处理json以及字符串的比较等常用操作
2013/09/08 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
jQuery模拟select实现下拉菜单功能
2016/06/20 Javascript
学习vue.js计算属性
2016/12/03 Javascript
javascript构造函数以及原型对象的理解
2017/01/13 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
js微信分享实现代码
2020/10/11 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
[42:00]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第一场 12.13
2020/12/17 DOTA
基于python实现微信模板消息
2015/12/21 Python
python操作 hbase 数据的方法
2016/12/18 Python
python实现批量修改文件名代码
2017/09/10 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
Python3如何判断三角形的类型
2020/04/12 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
英国玛莎百货新西兰:Marks & Spencer New Zealand
2019/07/21 全球购物
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
商务英语专业自荐信
2013/10/14 职场文书
企业管理培训感言
2014/01/27 职场文书
数控个人求职信范文
2014/02/03 职场文书
项目总经理岗位职责
2014/02/14 职场文书
敬老院标语
2014/06/27 职场文书
护士工作失误检讨书
2014/09/14 职场文书
2015年征兵工作总结
2015/07/23 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
NASA 机智号火星直升机拍到了毅力号设备碎片
2022/04/29 数码科技
mysql全面解析json/数组
2022/07/07 MySQL