用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 调用远程url的六种方法小结
Nov 02 PHP
php printf输出格式使用说明
Dec 05 PHP
使用php统计字符串中中英文字符的个数
Jun 23 PHP
PHP+Ajax实时自动检测是否联网的方法
Jul 01 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
php实现网页端验证码功能
Jul 11 PHP
PHP折半(二分)查找算法实例分析
May 12 PHP
PHP date()格式MySQL中插入datetime方法
Jan 29 PHP
PHP数据对象映射模式实例分析
Mar 29 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 PHP
laravel框架中视图的基本使用方法分析
Nov 23 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
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
一个实用的php验证码类
2017/07/06 PHP
从JavaScript的函数重名看其初始化方式
2007/03/08 Javascript
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
javascript常用的方法整理
2015/08/20 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
2016/05/14 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
JavaScript面向对象编程小游戏---贪吃蛇代码实例
2019/05/15 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
django之常用命令详解
2016/06/30 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
Python Selenium安装及环境配置的实现
2020/03/17 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
Python使用re模块验证危险字符
2020/05/21 Python
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
机电专业大学生求职信
2013/10/04 职场文书
大三学生入党思想汇报
2014/01/02 职场文书
十岁生日父母答谢词
2014/01/18 职场文书
危爆物品安全大检查大整治工作方案
2014/05/03 职场文书
采购部长岗位职责
2014/06/13 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server