用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转成EXE文件
Oct 09 PHP
剖析 PHP 中的输出缓冲
Dec 21 PHP
并发下常见的加锁及锁的PHP具体实现代码
Oct 12 PHP
php开启安全模式后禁用的函数集合
Jun 26 PHP
PHP数组循环操作详细介绍 附实例代码
Feb 03 PHP
LotusPhp笔记之:Cookie组件的使用详解
May 06 PHP
利用php绘制饼状图的实现代码
Jun 07 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
Feb 26 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
May 11 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
Apr 03 PHP
PHP实现字母数字混合验证码功能
Jul 11 PHP
php设计模式之职责链模式定义与用法经典示例
Sep 19 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中大于2038年时间戳的问题处理方案
2015/03/03 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
javascript 模拟点击广告
2010/01/02 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
Bootstrap选项卡与Masonry插件的完美结合
2016/07/06 Javascript
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
2016/07/27 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
举例详解HTML5中使用JSON格式提交表单
2015/06/16 HTML / CSS
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
日本最大的彩色隐形眼镜销售网站:CharmColor
2020/09/09 全球购物
Jar包的作用是什么
2014/03/30 面试题
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python