Laravel 大数据量分块处理_lamp_yang_3533的博客-CSDN博客


本站和网页 https://blog.csdn.net/lamp_yang_3533/article/details/87903492 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Laravel 大数据量分块处理_lamp_yang_3533的博客-CSDN博客
Laravel 大数据量分块处理
lamp_yang_3533
于 2019-02-24 15:10:27 发布
8793
收藏
12
分类专栏:
Laravel
文章标签:
Laravel
内存溢出
分块处理
分批处理
chunk
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lamp_yang_3533/article/details/87903492
版权
Laravel
专栏收录该内容
43 篇文章
3 订阅
订阅专栏
chunk() 的用法
有时,我们可能会一次性查出很大的结果集(上万条记录),这样就很可能导致内存溢出。
Laravel 框架的 chunk() 方法,可以将数据分块,每次只查询指定数量的数据块,交给回调函数处理。从而在处理大量数据集合时,能够有效减少内存消耗。
User::where('status', 0)->chunk(100, function ($users) {
foreach ($users as $user) {
$user->update(['name' => 'jack']);
});
其实,chunk() 方法就是分页获取数据块。
chunk() 的注意事项
如果 chunk() 方法的回调函数,内部有自更新,影响到了原始查询条件的记录总数,就会出现遗漏数据的情况。
比如,将上面的
$user->update(['name' => 'jack']);
更改为
$user->update(['status' => 1]);
其实,原因很简单,因为 chunk() 每次分块(分页)都会对原始数据进行重新查询。如果原始数据变了,就可能会影响到分页的偏移。
错误示例:
// 获取待处理的记录
$res = DB::connection('mysql_pms')->table('pms_product_app_map as m')
->selectRaw('m.*')
->leftJoin('pms_product_push_record as r', function ($join) {
$join->on('r.app_id', '=', 'm.app_id')
->on('r.product_code', '=', 'm.product_code');
})
->whereNull('r.id') // 过滤掉已经推送成功的商品
->orderBy('m.id', 'asc');
$count = $res->count(); // 记录总数
$count_success = []; // 成功的记录
$res->chunk(100, function ($records) use(&$count_success) {
foreach ($records as $record) {
try {
// todo
// 推送成功
// 记录推送成功的记录
$data = [
'product_id' => $record->product_id,
'updated_at' => Carbon::now()->toDateTimeString()
];
DB::connection('mysql_pms')->table('pms_product_push_record')->updateOrInsert(['app_id'=>$record->app_id, 'product_code'=>$record->product_code], $data);
$count_success[] = $record->id;
} catch (\Exception $e) {
// todo
});
因此,如果 chunk() 方法的回调函数内部有自更新,影响了记录总数,就不要使用 chunk() 方法。
这时,推荐使用 cursor() 方法。
cursor() 的用法
cursor() 方法,使用游标迭代处理数据库记录,一次只执行单个查询,在处理大批量数据时,cursor() 方法可大幅减少内存的消耗。
foreach (Flight::where('foo', 'bar')->cursor() as $flight) {
//
现在,我们使用 cursor() 游标重写上面的 chunk() 错误示例。
// 获取待处理的记录
$res = DB::connection('mysql_pms')->table('pms_product_app_map as m')
->selectRaw('m.*')
->leftJoin('pms_product_push_record as r', function ($join) {
$join->on('r.app_id', '=', 'm.app_id')
->on('r.product_code', '=', 'm.product_code');
})
->whereNull('r.id') // 过滤掉已经推送成功的商品
->orderBy('m.id', 'asc');
$count = $res->count(); // 记录总数
$count_success = []; // 成功的记录
foreach ($res->cursor() as $record) {
try {
// todo
// 推送成功
// 记录推送成功的记录
$data = [
'product_id' => $record->product_id,
'updated_at' => Carbon::now()->toDateTimeString()
];
DB::connection('mysql_pms')->table('pms_product_push_record')->updateOrInsert(['app_id'=>$record->app_id, 'product_code'=>$record->product_code], $data);
$count_success[] = $record->id;
} catch (\Exception $e) {
// todo
lamp_yang_3533
关注
关注
点赞
12
收藏
打赏
评论
Laravel 大数据量分块处理
chunk() 的用法有时,我们可能会一次性查出很大的结果集(上万条记录),这样就很可能导致内存溢出。Laravel 框架的 chunk() 方法,可以将数据分块,每次只查询指定数量的数据块,交给回调函数处理。从而在处理大量数据集合时,能够有效减少内存消耗。User::where('status', 0)->chunk(100, function ($users) { ...
复制链接
扫一扫
专栏目录
php 不占内存分块读取,Laravel分块不会减少PHP内存使用量
weixin_34442215的博客
04-01
70
所以我一直在Eloquent尝试laravel的分块,但我遇到了一个问题.请考虑以下代码(我的问题的更简化版本):$data = DB::connection('mydb')->table('bigdata')->chunk(200, function($data) {echo memory_get_usage();foreach($data as $d) {Model::create...
Laravel中chunk方法分块处理数据
weialemon
08-13
3694
在一些情况下,我们需要对大批量的数据进行操作,如果这个时候我们使用foreach的话,很可能会遇到操作超时的情况。在Laravel框架中我们可以很方便的使用chunk方法来解决。来看一个简单的例子:$users = User::all();
foreach ($users as $user) {
$some_value = ($user->some_field > 0) ? 1 ...
评论 4
您还未登录,请先
登录
后发表或查看评论
laravel excel分块导入_让 Laravel Scout 导入提速 64 倍
weixin_39796652的博客
12-06
311
文章转发自专业的Laravel开发者社区,原始链接:https://learnku.com/laravel/t/26935下一个版本的 Laravel Scout 将会使你的模型查询速度提升64倍。 我使用null scout 驱动测试了一张包含 1,632,576条数据的表。消耗的时间从过去的29分57秒缩短到了28秒。 ^[返回原文]^你能在这里 查看提交的 pull request.这篇文...
laravel数据批量操作
kirsten_z的博客
12-30
2182
1、批量更新
使用case when 拼sql
参照网址:
http://www.cnblogs.com/bruceleeliya/p/3310137.html
2、数据库操作三种方式
参照网址:
http://blog.csdn.net/zls986992484/article/details/52824962
3、
laravel结果分块、游标使用,游标内存溢出
wang1xiao2pan3的博客
11-14
792
参考官方文档在同步大量数据或者清洗大流量数据场景下可以使用的方法chunk方法和cursor方法
本地测试chunk可以正常使用,但是相对于游标的介绍
感觉游标才是首选,于是用了一张20万数量的表测试,结果直接内存溢出,参考其它资料整理使用方案如下
使用DB类
public function byCursor($con,$table)
$i = 0;
$pdo = $con->getPdo();
$pdo->setAttribute(\PDO::MY.
关于一个 Laravel 使用 cursor 占用内存问题
韩某的博客
03-03
1568
背景#
我需要把一张表的所有数据查询出来,然后逐一查询出来进行逻辑处理。
代码如下:
Laravel chunk 分块 以及存在的一些坑
曾沂宏的博客
03-26
6362
Laravel中chunk方法分块处理数据
Let’s imagine the situation: you have a big database table (like 10 000 rows or bigger) and you need to run an update to one column. But you cannot run just SQL query – there is...
Laravel中chunk方法分块处理数据,update需注意
beyond__devil的博客
07-12
6379
本来是查看,chunk是否支持where等条件筛选,也看了下源码,正好搜了篇文章,讲到这个 “update” 的问题!转载下,记录下,避免大家跳坑!
原文链接:
http://www.jianshu.com/p/5dafd0d6e69a
来自简书
在一些情况下,我们需要对大批量的数据进行操作,如果这个时候我们使用foreach的话,很可能会遇到操作超时的情况。
在Laravel框架...
laravel页面模板分块优化
欧阳小白闯天涯
07-15
419
主界面(样式页面)
需要进行后台数据填充的页面(数据填充页面)
最好是在views文件夹下将样式页面和数据填充页面,分为两个文件夹
原文请参考:http://blog.maptoface.com/post/45
...
php 数组分块查找,laravel 控制器类DB的相关操作操作
weixin_32287563的博客
03-22
57
$users = DB::table("users")->get();foreach ($users as $user){var_dump($user->name);}从数据表中分块查找数据列DB::table("users")->chunk(100, function($users){foreach ($users as $user){//}});通过在闭包中返回fals...
php更新千万级别数据,用Laravel轻松处理千万级数据的方法实现
weixin_35054319的博客
03-10
677
在Laravel中使用cursor来查询并处理数据 (轻松处理千万级的数据)事发现场最近在项目中遇到内存不足的问题, 测试环境中的PHP内存只有64M,在导出的时候, 数据量比较大,这个时候会出现内存溢出的错误;如何解决目前想到两种方法:调整php.ini文件中memory_limit配置项; 或者在调用方法中调整内存大小ini_set('memory_limit', "").使用Laravel的...
解决Laravel中chunk方法分块处理数据的坑
weixin_34269583的博客
06-14
2028
昨天在写脚本的时候,发现了一个问题,当我去分块去处理数据的时候,数据表的数据总是会出现缺失处理的情况。 在这里写个笔记 记录下这次的踩坑过程。 网上有好多地方能看到这个坑,但是都没有给出具体的解决方案。
Laravel中chunk方法分块处理数据的坑: Laravel中chunk方法分块处理数据
先说会引发这个问题的原因: 主要是因为...
Laravel Get、Cursor、Chunk、Offset 对比
最新发布
咳咳,请多指教
11-15
678
1. Get
public function testGet()
$start = microtime(true);
$num = 0;
$rs = TestModel::get();
foreach ($rs as $v) {
$num++;
$end = microtime(true);
echo $num . PHP_EOL;
echo ($end - $start) . PHP_EOL;
$mem
laravel的模块化是如何实现的
qw_xingzhe的专栏
02-07
1790
laravel的模块化是如何实现的
在laravel提供的官方文档上,有一个这样的名词 服务提供者,文档中介绍了它在laravel框架中的角色,以及如何使用它,但却没有讲明服务提供者的本质--它是为了解决什么问题而存在的? 不解决这一点,对于它的理解,则只会停留在表面.服务提供者是laravel实现模块化设计的手法.
为什么要进行模块化设计这里就不说的,可以参考下这些:模块化设计 ,
Laravel中chunk组块结果集处理
weixin_30950607的博客
08-19
137
如果你需要处理成千上万个 Eloquent 结果,可以使用chunk命令。chunk方法会获取一个“组块”的 Eloquent 模型,并将其填充到给定闭包进行处理。使用chunk方法能够在处理大量数据集合时能够有效减少内存消耗:
Flight::chunk(200, function ($flights) {
foreach ($flights as $flight) {...
Laravel数据库操作的三种方式
热门推荐
倾城一笑stu
10-15
12万+
Laravel提供了3种操作数据库方式:DB facade(原始方式)、查询构造器和Eloquent ORM。下面我将逐一讲解。
数据库的配置文件在config目录下的database.php里。打开这个文件,找到mysql的配置项。
这里有个env,它其实是调用了laravel根目录下的.env文件,这个文件存储了数据库的配置信息。打开它。修改为项目的数据库信息即可。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:Age of Ai
设计师:meimeiellie
返回首页
lamp_yang_3533
CSDN认证博客专家
CSDN认证企业博客
码龄8年
暂无认证
396
原创
1万+
周排名
121万+
总排名
180万+
访问
等级
1万+
积分
1084
粉丝
874
获赞
189
评论
1426
收藏
私信
关注
热门文章
如何查看MySQL的版本?
182361
如何配置Linux系统的IP地址?
103461
使用VMware给虚拟机安装linux系统
92542
Linux系统中挂载和使用光盘的基本步骤
83241
谷歌浏览器扩展程序报错 The message port closed before a response was received.
40627
分类专栏
Ubuntu
2篇
消息队列中间件
14篇
Linux 基础知识
58篇
Vue.js
24篇
Yii 2.0 框架学习笔记
20篇
Webpack
6篇
PHP
47篇
开发工具
20篇
MySQL
30篇
web服务器
9篇
PHP中常用的自定义函数
12篇
ThinkPHP
2篇
Memcache
4篇
Redis
8篇
Version Control
8篇
Socket
2篇
Yii
20篇
PHP核心技术
23篇
网站安全
3篇
其他
9篇
Linux
58篇
高性能网站架构
5篇
PHP面试题
7篇
PHP扩展
10篇
CentOS7
3篇
Docker
10篇
Web前端
14篇
Laravel
43篇
Elastic Stack
8篇
Node.js
4篇
最新评论
谷歌浏览器扩展程序报错 The message port closed before a response was received.
敲代码的小莫:
这个添加 return true 这句代码的位置 在哪里,能具体说明一下吗?是谷歌内部那个位置还是哪里???
Laravel 大数据量分块处理
Yam_3:
🐂,用了chunk解决问题了
谷歌浏览器扩展程序报错 The message port closed before a response was received.
zzz_hhh_aaa:
没用,我觉得就是api设计缺陷。他这个eventListener的回调函数在一次事件循环内如果没有主动调用响应函数,api就自动用undifiened响应,然后另一边收到undifiened就把结束端口关闭了。然后真正的响应到达的时候就会报错。
应该没法解决。
如何禁止谷歌浏览器强制跳转至 https
前端小渣渣神:
换火狐浏览器
Laravel 大数据量分块处理
jokeMike:
用了这个cursor 确实数据出现了,用get直接卡死不出来
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Win10 的 Ubuntu子系统安装可视化图形界面
Ubuntu 20.04 apt 源修改为国内的阿里云镜像源
RabbitMQ 死信队列
2021年2篇
2020年20篇
2019年56篇
2018年98篇
2017年67篇
2016年157篇
2015年4篇
目录
目录
分类专栏
Ubuntu
2篇
消息队列中间件
14篇
Linux 基础知识
58篇
Vue.js
24篇
Yii 2.0 框架学习笔记
20篇
Webpack
6篇
PHP
47篇
开发工具
20篇
MySQL
30篇
web服务器
9篇
PHP中常用的自定义函数
12篇
ThinkPHP
2篇
Memcache
4篇
Redis
8篇
Version Control
8篇
Socket
2篇
Yii
20篇
PHP核心技术
23篇
网站安全
3篇
其他
9篇
Linux
58篇
高性能网站架构
5篇
PHP面试题
7篇
PHP扩展
10篇
CentOS7
3篇
Docker
10篇
Web前端
14篇
Laravel
43篇
Elastic Stack
8篇
Node.js
4篇
目录
评论 4
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
lamp_yang_3533
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值