用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
笑谈配置,使用Smarty技术
Jan 04 PHP
PHP高自定义性安全验证码代码
Nov 27 PHP
php简单开启gzip压缩方法(zlib.output_compression)
Apr 13 PHP
新浪SAE云平台下使用codeigniter的数据库配置
Jun 12 PHP
PHP两种快速排序算法实例
Feb 15 PHP
php类常量用法实例分析
Jul 09 PHP
使用Composer安装Yii框架的方法
Mar 15 PHP
PHP屏蔽关键字实现方法
Nov 17 PHP
如何判断php mysqli扩展类是否开启
Dec 24 PHP
php生成图片缩略图功能示例
Feb 22 PHP
PHP实现的mongoDB数据库操作类完整实例
Apr 10 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
SSI指令
2006/11/25 PHP
两个开源的Php输出Excel文件类
2010/02/08 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
Python构造自定义方法来美化字典结构输出的示例
2016/06/16 Python
常见python正则用法的简单实例
2016/06/21 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
python记录程序运行时间的三种方法
2017/07/14 Python
Python 装饰器使用详解
2017/07/29 Python
详解python中的线程
2018/02/10 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
Python Excel处理库openpyxl使用详解
2019/05/09 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
台湾深度自由行旅游平台:Tripbaa趣吧
2017/10/10 全球购物
怎样在程序里获得一个空指针
2015/01/24 面试题
大专毕业生自我评价分享
2013/11/10 职场文书
幼儿教育感言
2014/02/05 职场文书
法学自荐信
2014/06/20 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
毕业横幅标语
2014/10/08 职场文书
会计手工模拟做账心得体会
2016/01/22 职场文书
子女赡养老人协议书
2016/03/23 职场文书
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android