在Laravel中使用cursor来查询并处理数据 (轻松处理千万级的数据) | Laravel China 社区


本站和网页 https://learnku.com/articles/52954 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

在Laravel中使用cursor来查询并处理数据 (轻松处理千万级的数据) | Laravel China 社区
Laravel
话题列表
社区 Wiki
优质外文
招聘求职
Laravel 实战教程
社区文档
登录
注册
Laravel
首页
Laravel
Go
PHP
Vue.js
Python
Java
MySQL
Rust
LK
Elasticsearch
F2E 前端
Server
程序员
Database
DevTools
Computer Science
手机开发
AdonisJS
社区
Wiki
教程
Laravel 实战教程首页
《L01 Laravel 教程 - Web 开发实战入门》
《L02 Laravel 教程 - Web 开发实战进阶》
《L03 Laravel 教程 - 实战构架 API 服务器》
《L04 Laravel 教程 - 微信小程序从零到发布》
《L05 Laravel 教程 - 电商实战》
《L06 Laravel 教程 - 电商进阶》
《LX1 Laravel / PHP 扩展包视频教程》
《LX2 PHP 扩展包实战教程 - 从入门到发布》
《L07 Laravel 教程 - Laravel TDD 测试实战》
《LX3 Laravel 性能优化入门》
《LX4 Laravel / PHP 五分钟视频》
文档
社区文档首页
《Laravel 中文文档》
《Laravel 速查表》
《PHP 代码简洁之道》
《Laravel 编码技巧》
《Dcat Admin 中文文档》
《Laravel Nova 中文文档》
《Lumen 中文文档》
《Dingo API 中文文档》
《 Laravel 项目开发规范》
《构建 Laravel 开发环境》
登录
注册
微信登录
在Laravel中使用cursor来查询并处理数据 (轻松处理千万级的数据)
zhonglang 的个人博客
739
创建于 2年前
更新于 2年前
在Laravel中使用cursor来查询并处理数据 (轻松处理千万级的数据)
事发现场
最近在项目中遇到内存不足的问题, 测试环境中的PHP内存只有64M,在导出的时候, 数据量比较大,这个时候会出现内存溢出的错误.
如何解决
目前想到两种方法:
调整php.ini文件中memory_limit配置项; 或者在调用方法中调整内存大小ini_set('memory_limit', "").使用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生成器的时候,可以渐进式的处理数据,即使在内存很小的情况下,也可以轻松处理千万级的数据! 真的是非常方便哦!
php
yield
laravel
本作品采用《CC 协议》,转载必须注明作者和本文链接
坚定地后端开发者
举报
zhonglang
32 声望
PHP是最好的语言
3 人点赞
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
推荐文章:
更多推荐...
博客
钱付了,订单还是未支付,用户炸了!——聊聊如何防止支付掉单!
36
20
4个月前
翻译
如何在 Laravel 中创建一个简单的事件流?
20
14
5个月前
博客
🎈 Slow Admin - 使用Laravel和Amis快速构建你的后台
25
35
5个月前
博客
用Go实现支持多种协议的抓包工具——Shermie-Proxy
23
34
7个月前
翻译
Laravel 代码重构:使用 Services, Events, Jobs, Actions 来重构控制器方法
67
23
8个月前
博客
使用 Laravel Filament 极速搭建美观大方的后台面板
21
44
8个月前
讨论数量: 3
排序:
时间
投票
Adachi
195 声望
如果只是导出的话,可以设置查询1000条,然后写入1000条,再查询1000条,再写入1000条。
2年前
评论
评论
zhonglang
(楼主)
2年前
这个方法适用于在有限内存中处理大数据的场景哦
举报
di-gua
266 声望
chunkById 更合适
2年前
评论
评论
举报
Adachi
195 声望
看到了你的已知条件,内存很少,这样导出几个G的文件也没啥问题,当然如果数据量很大的话 不要 用limit,会很慢。
$fp = fopen('xxx.csv', 'a');
Model::->orderBy('id')->chunk(1000, function($items) use ($fp) {
foreach ($items as $item)
fputcsv($fp, $item);
});
fclose($fp);
2年前
评论
评论
举报
讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
<a href="javascript:;" class="mr-2 ui popover text-mute" data-html="黏贴或拖拽图片至输入框内皆可上传图片">
<a href="javascript:;" class="mr-2 ui popover text-mute hide-on-mobile" data-html="支持除了 H1~H6 以外的GitHub 兼容 Markdown">
支持 MD
帮助
关注本文
评论
zhonglang
未填写
文章
粉丝
喜欢
收藏
15
排名:1510
访问:1813
关注
私信
所有博文
阅读模式
文章归档
1 篇
2022 年 5 月
1 篇
2022 年 3 月
3 篇
2022 年 1 月
1 篇
2020 年 12 月
最新文章
最受欢迎
8个月前
Laravel 中模型事件 Observer 的使用
11个月前
Homestead Vagrant 使用中的一些记录
1年前
[Go]Go 语言基础拾遗(一)
1年前
[工具]Pandoc 使用笔记
1年前
如何本地安装 godoc ?
在Laravel中使用cursor来查询并处理数据 (轻松处理千万级的数据)
如何本地安装 godoc ?
[Go]Go 语言基础拾遗(一)
Homestead Vagrant 使用中的一些记录
[工具]Pandoc 使用笔记
博客标签
php
laravel
yield
go基础
linux
社区赞助商
成为赞助商
社区赞助商
成为赞助商
关于 LearnKu
LearnKu 是终身编程者的修道场
做最专业、严肃的技术论坛
LearnKu 诞生的故事
资源推荐
《社区使用指南》
《文档撰写指南》
《LearnKu 社区规范》
《提问的智慧》
服务提供商
其他信息
成为版主
所有测验
联系站长(反馈建议)
粤ICP备18099781号-6
粤公网安备 44030502004330号
违法和不良信息举报
由 Summer 设计和编码 ❤
请登录
提交
忘记密码?
or
注册
第三方账号登录
微信登录
GitHub 登录
内容举报
匿名举报,为防止滥用,仅管理员可见举报者。
我要举报该,理由是:
垃圾广告:恶意灌水、广告、推广等内容
无意义内容:测试、灌水、文不对题、消极内容、文章品质太差等
违规内容:色情、暴利、血腥、敏感信息等
不友善内容:人身攻击、挑衅辱骂、恶意行为
科学上网:翻墙、VPN、Shadowsocks,政策风险,会被关站!
不懂提问:提问太随意,需要再做一遍《提问的智慧》测验
随意提问:提问没有发布在社区问答分类下
排版混乱:没有合理使用 Markdown 编写文章,未使用代码高亮
内容结构混乱:逻辑不清晰,内容混乱,难以阅读
标题随意:标题党、标题不释义
尊重版权:分享付费课程、破解软件(付费),侵犯作者劳动成果
其他理由:请补充说明
举报
取消