用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面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
Sep 30 PHP
国外PHP程序员的13个好习惯小结
Feb 20 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
May 08 PHP
Yii学习总结之安装配置
Feb 22 PHP
php实现将任意进制数转换成10进制的方法
Apr 17 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
Nov 17 PHP
10个对初学者非常有用的PHP技巧
Apr 06 PHP
php面向对象之反射功能与用法分析
Mar 29 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 PHP
php strftime函数的详细用法
Jun 21 PHP
Laravel框架Request、Response及Session操作示例
May 06 PHP
PHP的垃圾回收机制代码实例讲解
Feb 27 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
东方红 - 来复式再生机的修复
2021/03/02 无线电
本地计算机无法启动Apache故障处理
2014/08/08 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
javascript import css实例代码
2008/07/18 Javascript
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
如何提高javascript加载速度
2016/12/26 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
Python 实现两个列表里元素对应相乘的方法
2018/11/14 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
一句话工作感言
2014/03/01 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
奶茶店创业计划书
2014/08/14 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
七年级作文之我的梦想
2019/10/16 职场文书
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers