关于使用 Lazy Collections 来提高 Laravel Excel 读取的性能详解(轻松支持百万数据)
发布时间 - 2020-03-21 00:00:00 点击率:次在 laravel 6 中添加了一种新类型的集合: lazy collections。 如果需要处理非常大的数据集(数千或数百万行)而不会遇到内存限制,那么它们是非常棒的。
推荐:laravel教程
我最近的任务是在工作中的一个项目中重构 Excel 导出。 问题是,由于数据集太大,Laravel 无法处理,导出无法再创建。 数据库查询返回了大约 300,000 个结果! 应用程序产生超时或一直内存不足。
一种天真的方法是增加超时时间或内存限制,并希望下次出现问题时,另一个人会处理这个问题。 但这不是我的工作方式。 我不喜欢创可贴。 我喜欢具体的、长期的解决方案。
Laravel Excel 扩展包已经相当灵活。 通过在使用 FromQuery-concerns 时使用「chunks」,它在减少数据库负载方面做得很好。 然而,我们的导出仍然很难处理大数据集。
我和我的同事讨论过,我们是否应该完全重写这个特性:将导出推送到队列中,并在导出结束时向用户发送通知。 然而,这个功能在这个应用程序中只是一个很小的东西。 对我们来说,仅仅为了一个简单的导出而增加如此多的开销是没有意义的。
那天晚些时候,我有一个小小的「我发现了」的时刻,因为我记得 Laravel 中有 LazyCollections 这个东东。
我重新编写了导出:它现在使用 FromCollection-concern,而不是 FromQuery。 我必须对 collection() 方法进行的惟一更改是将查询构建器链末尾的 get() 方法替换为 cursor()。
下面是我们导出功能的简化版本。 Request 对象通过构造函数传递,因此我们可以根据用户在 UI 中选择的内容对查询进行调整。
request = $request;} public function collection() { return User::query() ->when($this->request->get('include_subscribed'), function ($q) { return $q->where('is_subscribed', true); }) ->cursor(); // ← 重要的一点 } }
我相信你在你的项目中遇到了内存问题。 你增加了内存限制,希望问题已经解决了 (我自己已经做过无数次了)。
如果是在 Laravel 项目中,我希望,我可以让你重新查看该代码并使用 LazyCollections 重写。
修复这个问题非常有趣,所以我做了一个小小的基准测试:我们的导出现在可以轻松地导出数百万行,而不会遇到内存限制。 太酷了!
# laravel
# 构造函数
# Collection
# 对象
# 数据库
# ui
# 重构
# excel
# 这个问题
# 重写
# 一个小小
# 数百万
# 应用程序
# 是在
# 很好
# 让你
# 在这个
# 很难
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何处理CORS跨域请求?(配置示例)
java ZXing生成二维码及条码实例分享
如何解决hover在ie6中的兼容性问题
如何用已有域名快速搭建网站?
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
如何快速搭建高效简练网站?
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
,怎么在广州志愿者网站注册?
米侠浏览器网页背景异常怎么办 米侠显示修复
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
简单实现Android文件上传
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Python文件异常处理策略_健壮性说明【指导】
jQuery 常见小例汇总
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
如何用腾讯建站主机快速创建免费网站?
手机网站制作与建设方案,手机网站如何建设?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
如何选择PHP开源工具快速搭建网站?
如何安全更换建站之星模板并保留数据?
网站制作报价单模板图片,小松挖机官方网站报价?
在线制作视频的网站有哪些,电脑如何制作视频短片?
Python自动化办公教程_ExcelWordPDF批量处理案例
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
linux top下的 minerd 木马清除方法
微信小程序 HTTPS报错整理常见问题及解决方案
JavaScript如何实现错误处理_try...catch如何捕获异常?
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
深圳网站制作培训,深圳哪些招聘网站比较好?
长沙做网站要多少钱,长沙国安网络怎么样?
JavaScript如何实现继承_有哪些常用方法
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
如何在橙子建站中快速调整背景颜色?
Linux网络带宽限制_tc配置实践解析【教程】
Laravel怎么实现模型属性的自动加密
如何在建站主机中优化服务器配置?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
如何在IIS中新建站点并配置端口与IP地址?
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
如何正确下载安装西数主机建站助手?
如何挑选高效建站主机与优质域名?
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
高端企业智能建站程序:SEO优化与响应式模板定制开发
微信小程序 canvas开发实例及注意事项
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?


}
public function collection()
{
return User::query()
->when($this->request->get('include_subscribed'), function ($q) {
return $q->where('is_subscribed', true);
})
->cursor(); // ← 重要的一点
}
}