用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 相关文章推荐
简单的过滤字符串中的HTML标记
Dec 25 PHP
PHP 数组教程 定义数组
Oct 23 PHP
PHP常用代码大全(新手入门必备)
Jun 29 PHP
PHP中单引号与双引号的区别分析
Aug 19 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
yii插入数据库防并发的简单代码
May 27 PHP
PHP微信模板消息操作示例
Jun 29 PHP
Yii2第三方类库插件Imagine的安装和使用
Jul 06 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
Aug 16 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 PHP
如何通过PHP实现Des加密算法代码实例
May 09 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使用递归算法无限遍历数组示例
2017/01/13 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
js读取cookie方法总结
2014/10/31 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
bootstrap table小案例
2016/10/21 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
vue权限路由实现的方法示例总结
2018/07/29 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
python模拟登陆阿里妈妈生成商品推广链接
2014/04/03 Python
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
详解Python使用simplejson模块解析JSON的方法
2016/03/24 Python
用python实现百度翻译的示例代码
2018/03/09 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
Python图像读写方法对比
2020/11/16 Python
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
2014年创卫实施方案
2014/02/18 职场文书
洗车工岗位职责
2014/03/15 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
股票投资建议书
2014/05/19 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
2014年社区居委会主任重阳节讲话稿
2014/09/25 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python
Oracle中DBLink的详细介绍
2022/04/29 Oracle