用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 相关文章推荐
数据库相关问题
Oct 09 PHP
解析php DOMElement 操作xml 文档的实现代码
May 10 PHP
php生成excel列序号代码实例
Dec 24 PHP
PHP static局部静态变量和全局静态变量总结
Mar 02 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
Sep 28 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
Jul 25 PHP
PHP验证码类ValidateCode解析
Jan 07 PHP
PHP实现腾讯与百度坐标转换
Aug 05 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
PHP PDOStatement::bindColumn讲解
Jan 30 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 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校验表单检测字段是否为空的方法
2015/03/20 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
PHP模拟http请求的方法详解
2016/11/09 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
Prototype Date对象 学习
2009/07/12 Javascript
Javascript的闭包
2009/12/31 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
JavaScript SHA512加密算法详细代码
2016/10/06 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
2019/09/12 Javascript
JS回调函数深入理解
2019/10/16 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
python类和继承用法实例
2015/07/07 Python
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
python unichr函数知识点总结
2020/12/16 Python
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
企业内部培训方案
2014/02/04 职场文书
读书伴我成长演讲稿
2014/05/07 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL