用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 相关文章推荐
PHP编程与应用
Oct 09 PHP
php下过滤HTML代码的函数
Dec 10 PHP
php中利用str_pad函数生成数字递增形式的产品编号
Sep 30 PHP
php session劫持和防范的方法
Nov 12 PHP
php实现的Cookies操作类实例
Sep 24 PHP
PHP 生成N个不重复的随机数
Jan 21 PHP
php实现每天自动变换随机问候语的方法
May 12 PHP
PHP之密码加密的几种方式
Jul 29 PHP
php排序算法实例分析
Oct 17 PHP
php接口实现拖拽排序功能
Apr 23 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
Mar 21 PHP
php array 转json及java 转换 json数据格式操作示例
Nov 13 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使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
php中青蛙跳台阶的问题解决方法
2018/10/14 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
Vue elementui字体图标显示问题解决方案
2020/08/18 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
使用Python的判断语句模拟三目运算
2015/04/24 Python
Python实现文件内容批量追加的方法示例
2017/08/29 Python
解读python如何实现决策树算法
2018/10/11 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
HTML5表格_动力节点Java学院整理
2017/07/11 HTML / CSS
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
ABOUT YOU罗马尼亚:超过600个时尚品牌
2019/09/19 全球购物
生日邀请函范文
2014/01/13 职场文书
音乐专业自荐信
2014/02/07 职场文书
历史专业学生的自我评价
2014/02/28 职场文书
2014年入党积极分子党校培训心得体会
2014/07/08 职场文书
重点工程汇报材料
2014/08/27 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
《打电话》教学反思
2016/02/22 职场文书
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技