用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 相关文章推荐
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
Jun 08 PHP
php压缩多个CSS为一个css的代码并缓存
Apr 21 PHP
WordPress中is_singular()函数简介
Feb 05 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
Mar 18 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
Jan 14 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
ThinkPHP发送邮件示例代码
Oct 08 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
Apr 03 PHP
php变量与JS变量实现不通过跳转直接交互的方法
Aug 25 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 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购物车实现方法
2015/01/03 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
javascript折半查找详解
2015/01/26 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
python使用Pycharm创建一个Django项目
2018/03/05 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
实例讲解python中的协程
2018/10/08 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
Python笔记之facade模式
2019/11/20 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
Pandas对每个分组应用apply函数的实现
2020/12/13 Python
美国知名奢侈美容品牌零售商:Cos Bar
2017/04/21 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
化学系大学生自荐信范文
2014/03/01 职场文书
相亲大会策划方案
2014/06/05 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
介绍信的写法
2015/01/31 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
合同范本之电脑出租
2019/08/13 职场文书
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python
Spring中的@Transactional的工作原理
2022/06/05 Java/Android