用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 用sock技术发送邮件的函数
Jul 21 PHP
php+mysql 实现身份验证代码
Mar 24 PHP
PHP用GD库生成高质量的缩略图片
Mar 09 PHP
第4章 数据处理-php数组的处理-郑阿奇
Jul 04 PHP
深入php list()函数的详解
Jun 05 PHP
php用正则表达式匹配中文实例详解
Nov 06 PHP
学习php设计模式 php实现模板方法模式
Dec 08 PHP
一波PHP中cURL库的常见用法代码示例
May 06 PHP
zend framework重定向方法小结
May 28 PHP
PHP开发制作一个简单的活动日程表Calendar
Jun 20 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
Dec 12 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 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
15种PHP Encoder的比较
2007/04/17 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
PHP生成Gif图片验证码
2013/10/27 PHP
PHP中数组的分组排序实例
2014/06/01 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
jquery如何根据值设置默认的选中项
2014/03/17 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
深入浅出讲解ES6的解构
2016/08/03 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
详解Node.js实现301、302重定向服务
2017/04/07 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
JavaScript使用百度ECharts插件绘制饼图操作示例
2019/11/26 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
Python zip函数打包元素实例解析
2019/12/11 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
菲律宾购物网站:Lazada菲律宾
2018/04/05 全球购物
JD Sports荷兰:英国领先的运动时尚零售商
2020/03/13 全球购物
如何利用cmp命令比较文件
2016/04/11 面试题
斯福泰克软件测试面试题
2015/02/16 面试题
物业总经理岗位职责
2014/02/28 职场文书
公司辞职信模板
2015/05/13 职场文书
python保存图片的四个常用方法
2022/02/28 Python