用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 相关文章推荐
Linux下进行MYSQL编程时插入中文乱码的解决方案
Mar 15 PHP
15种PHP Encoder的比较
Apr 17 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
Apr 28 PHP
PHP执行zip与rar解压缩方法实现代码
Dec 05 PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
解析php类的注册与自动加载
Jul 05 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
Sep 06 PHP
PHP使用递归生成文章树
Apr 21 PHP
PHP实现小偷程序实例
Oct 31 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 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中的switch语句的用法实例详解
2015/10/21 PHP
js输出列表实现代码
2010/09/12 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
AngularJS入门之动画
2016/07/27 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
原生js实现放大镜
2017/02/20 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
微信小程序实现蓝牙打印
2019/09/23 Javascript
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
Python三元运算实现方法
2015/01/12 Python
python查找指定具有相同内容文件的方法
2015/06/28 Python
python批量制作雷达图的实现方法
2016/07/26 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
python opencv检测目标颜色的实例讲解
2018/04/02 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
Python日志syslog使用原理详解
2020/02/18 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
Python模块常用四种安装方式
2020/10/20 Python
网络技术支持面试题
2013/04/22 面试题
机械绘图员岗位职责
2013/11/19 职场文书
质检部职责
2013/12/28 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
先进集体获奖感言
2014/02/13 职场文书
节约电力资源的建议书
2014/03/12 职场文书
品质口号大全
2014/06/17 职场文书
某集团股份有限公司委托书样本
2014/09/24 职场文书
电影圆明园观后感
2015/06/03 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP
Android存储中最基本的文件存储方式
2022/04/30 Java/Android