laravel对于数据量特别大的导出excel的提速方案

news2025/2/27 21:02:00

背景:一些业务场景需要导出excel的需求,但是面对日益增长的数据,要导出的数据会越来越大。生成表格的时间也会越来越慢。针对这个问题,目前的业务通过两个角度去提速。

1:异步导出

如果数据量达到一定的体量,单单通过同步的话,等待的时间会特别慢。

这个时候,为了照顾用户体验,我们或许可以选择异步来进行导出,就是用户在页面上提交导出申请,然后我们会在队列里面执行生成excel,并且生成之后提醒用户查看。

在这个任务过程中,最好可以分块处理数据,比如:

chunk分块---组块结果集

如果你需要处理成千上百条数据库记录,可以考虑使用 chunk 方法,该方法一次获取结果集的一小块,然后传递每一小块数据到闭包函数进行处理,该方法在编写处理大量数据库记录的 Artisan 命令的时候非常有用。

例如,我们可以将处理全部 users 表数据分割成一次处理 100 条记录的小组块:

 

DB::table('users')->orderBy('id')->chunk(100, function($users) {
    foreach ($users as $user) {
        //
    }
});

你可以通过从闭包函数中返回 false 来终止组块的运行:

DB::table('users')->orderBy('id')->chunk(100, function($users) {
    // 处理结果集...
    return false;
});

如果你要在组块结果集中更新数据库记录,组块结果可能会以意想不到的方式被更改。因此,在组块查询中更新记录时,最好使用 chunkById 方法。该方法会自动基于记录的主键对结果集进行分页:

DB::table('users')->where('active', false)
    ->chunkById(100, function ($users) {
        foreach ($users as $user) {
            DB::table('users')
                ->where('id', $user->id)
                ->update(['active' => true]);
        }
    });

注:在组块回调中更新或删除记录时,对主键或外键的任何更改都会影响组块查询,甚至会导致相应记录不被包含在组块结果集中。

如果是在chunk里面进行遍历给数组插入数据,必须use引用变量,否则最后的数组并不是全部数据,以我写的例子如下:

 

2:xlsExcel

不管是laravel-excel或者是\Maatwebsite\Excel ,一旦遇到数据量一大(几万条数据)的话,导出就会变得特别慢,然后我偶然发现xlsExcel的导出效率还是挺高的,实测7w多条数据导出只需要6秒多。所以已经满足我目前业务的需求,贴出laravel下xlsExcel的配置方案:

(1):安装xlsExcel

https://pecl.php.net/package/xlswritericon-default.png?t=M85Bhttps://pecl.php.net/package/xlswriter因为 laravel-xlsExcel扩展要求xlsExcel的版本必须为1.3.7,所以我这次选择下载这个版本

windows

注意:window 注意版本、是否线程安全、操作系统位数.

因为我电脑的环境,所以我选择php7.4,ts,64位的版本

 解压之后放在\php\ext 里面

修改php.ini

extension=xlswriter

重启apache生效。

linux:

wget https://pecl.php.net/get/xlswriter-1.3.2.tgz
 
tar xf xlswriter-1.3.2.tgz
 
cd xlswriter-1.3.2
 
/www/server/php/72/bin/phpize
 
./configure --with-php-config=/www/server/php/72/bin/php-config --enable-reader
 
make && make install
 
echo "extension = xlswriter.so" >> /www/server/php/74/etc/php.ini

也可以自行下载后安装。

(2)安装laravel-xlsExcel扩展

composer require lysice/laravel-xlswriter

将 ServiceProvider 加入到 app.php 中:

'providers' => [
     /* * Laravel Framework Service Providers... */ 
     ... 
         \Lysice\XlsWriter\XlsWriterServiceProvider::class 
 ],

发布 Facade 将 Excel 加入到 app.php 中:

 'aliases' => [ 
    ... 
     'Excel' => \Lysice\XlsWriter\Facade\Writer::class 
  ],

发布 xlswriter.php 配置文件:

 php artisan vendor:publish --provider="Lysice\XlsWriter\XlsWriterServiceProvider"

查看 xlswriter 扩展是否正常安装

 php artisan xls:status


//如果成功则显示如下
laravel-xlsWriter info:
+---------+---------------------------------------------+
| version | 1.0                                         |
| author  | lysice<https://github.com/Lysice>           |
| docs    | https://github.com/Lysice/laravel-xlswriter |
+---------+---------------------------------------------+
XlsWriter extension status:
+-------------------------------+----------------------------+
| loaded                        | yes                        |
| xlsWriter author              | Jiexing.Wang (wjx@php.net) |
| xlswriter support             | enabled                    |
| Version                       | 1.3.7                      |
| bundled libxlsxwriter version | 1.0.0                      |
| bundled libxlsxio version     | 0.2.27                     |
+-------------------------------+----------------------------+

然后就可以使用了:

 调用门面的方法前面需要加斜杠/

处理数据的文件如下:

<?php

namespace App\Exports;

use Lysice\XlsWriter\Interfaces\FromArray;

class StockSummaryDetailXlsExport implements FromArray
{
 /** 
  * @return array */ 
  public function array() : array 
  { 
    return [ ['哈哈', 'aaa'],
         ['哈哈', 'aaa'],
         ['哈哈', 'aaa'],
         ['哈哈', 'aaa']
         ]; 
  }
 /** 
   * @return array 
   */ 
 public function headers() : array {
     return []; 
 }
}

目前提速只用到这两种方案,导出大数据的效率提升了80倍。

如果有其他欢迎分享交流。

 参考:

1:xlsExcel官方文档

https://xlswriter-docs.viest.me/zh-cn/an-zhuang/ubuntuicon-default.png?t=M85Bhttps://xlswriter-docs.viest.me/zh-cn/an-zhuang/ubuntu

2:laravel-xlsExcel官方文档

https://learnku.com/articles/56844icon-default.png?t=M85Bhttps://learnku.com/articles/56844

3: laravel-xlsExcel----git地址

https://github.com/viest/php-ext-xlswritericon-default.png?t=M85Bhttps://github.com/viest/php-ext-xlswriter

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【毕业设计】大数据大众点评评论文本分析 - python 数据挖掘

文章目录0 前言1 爬虫1.1 整体思路1.2 网页爬取和解析1.3 数据存储1.4 反爬虫对抗2 探索性分析与文本数据预处理2.1 探索性分析2.2 数据预处理2.3 词云展示3 文本的情感分析3.1 先上结果3.2 文本特征提取&#xff08;TF-IDF&#xff09;3.3 机器学习建模3.4 最后输出的准确率4 …

java ssh校园拼餐系统

首先在系统前台&#xff0c;游客用户可以经过账号注册&#xff0c;管理员审核通过后&#xff0c;用账号密码登录系统前台&#xff0c;查看拼餐服务、网站公告、文明拼餐员、会员风彩、系统简介、咨询信息、拼餐信息等栏目信息&#xff0c;进行在线咨询和管理员交流&#xff0c;…

LTSPICE使用教程:二极管钳位电路仿真

在我们查看芯片内部的设计电路时&#xff0c;通常会发现以下的电路结构&#xff1a; 当定义pin脚输入电压Vpin&#xff0c; 1.Vpin>VDD,二极管D1导通&#xff0c;D2截止&#xff0c;此时无论怎样继续加大VPIN的输入电压时&#xff0c; 进入到管脚内部的电压会被钳制在Vint…

【RocketMQ中生产者生产消息的高可用机制、消费者消费消息的高可用机制、消息的重试机制、死信队列于死信消息】

一.知识回顾 【0.RocketMQ专栏的内容在这里哟&#xff0c;帮你整理好了&#xff0c;更多内容持续更新中】 【1.Docker安装部署RocketMQ消息中间件详细教程】 【2.RocketMQ生产者发送消息的三种方式:发送同步消息、异步消息、单向消息&案例实战&详细学习流程】 【3.Rock…

野火FPGA入门(5)

文章目录第17讲&#xff1a;触摸按键控制LED灯第18讲&#xff1a;流水灯第19讲&#xff1a;呼吸灯第20讲&#xff1a;状态机第21讲&#xff1a;无源蜂鸣器驱动实验第17讲&#xff1a;触摸按键控制LED灯 触摸按键可分为四大类&#xff1a;电阻式、电容式、红外感应式、表面声波…

调优工具常用命令

语法格式 mysqldumpslow [ OPTS... ] [ LOGS... ] //命令行格式常用到的格式组合 -s 表示按照何种方式排序c 访问次数l 锁定时间r 返回记录t 查询时间al 平均锁定时间ar 平均返回记录数at 平均查询时间 -t 返回前面多少条数据 -g 后边搭配一个正则匹配模式&#xff0c;大小写…

机械专业学子的芯片封装仿真“逆袭之路”

作者&#xff1a;萧显军 导读&#xff1a;近期&#xff0c;ANSYS公司给清华大学集成电路学院捐赠了一批业界领先的计算机辅助工程(CAE)软件及自动化(EDA)软件&#xff0c;为清华大学的芯片设计仿真的教学科研工作提供更强大的软件服务与技术支撑。 捐的仿真软件包括ANSYS涉及…

小白学Java

ip地址&#xff1a;用于唯一识别标记网络中的每一台计算机 查看方法&#xff1a;ipconfig ip地址的表示形式&#xff1a;点分十进制 xx.xx.xx.xx 每个十进制数的范围&#xff1a;0-255 ip地址的组成 网络地址主机地址 ipv4地址分类&#xff1a; &#xff08;特殊&#xff1a;…

一、react简介

目标 理解react这个框架在前端开发中的地位理解react诞生的原因和意义&#xff08;react是一个用于快速构建前端视图的javaScript库&#xff09;理解什么是虚拟dom、原生js模拟出虚拟dom的表示&#xff0c;模拟出创建虚拟dom的方法&#xff0c;模拟出虚拟dom转换成真实dom的方…

什么是甘特图?什么是项目管理?

数字化与信息化早已成为现今人们工作和生活中不可缺少的一部分。尤其是随着科学技术的进步&#xff0c;人们对数字化的期待也越来也高。作为项目管理中常备的工具&#xff0c;甘特图已经成为不少业内人士中常备的“神器”了。然而依旧有人搞不清甘特图与项目管理区别究竟在哪里…

Revit中创建基于线的砌体墙及【快速砌体排砖】

​  墙可以更改内部结构和材质&#xff0c;但是很难画出砌块样式形成的墙体&#xff0c;我们可以用其他方式画出砌体排砖墙么?这里我们用基于线的常规模型做砌体排砖墙。在开始我们需要做两个族&#xff0c;作为砌体排砖墙的基本单位&#xff0c;也就是一个单独的砌体块。 一…

多亏了这份大佬整理的Java进阶笔记,让我斩获7个offer

移动互联网时代&#xff0c;IT 系统变得愈加复杂&#xff0c;对我们程序员的要求也是越来越高&#xff0c;技术不断更新&#xff0c;我们还不能停止学习&#xff0c;停下来了就会被打上一个‘不合格的程序员’的标签&#xff0c;如何成为一位「不那么差」的程序员&#xff1f; …

java.io.IOException: FIS_AUTH_ERROR in Android Firebase

项目里更换完google-services.json文件后&#xff0c;获取 firebase token 时&#xff0c;显示报错&#xff1a; E/FirebaseInstanceId: Topic sync or token retrieval failed on hard failure exceptions: FIS_AUTH_ERROR. Wont retry the operation.D/AndroidRuntime: Sh…

测试行业3年经验,从大厂裸辞后,面试阿里、字节全都一面挂,被面试官说我的水平还不如应届生

测试员可以先在大厂镀金&#xff0c;以后去中小厂毫无压力&#xff0c;基本不会被卡&#xff0c;事实果真如此吗&#xff1f;但是在我身上却是给了我很大一巴掌... 所谓大厂镀金只是不卡简历而已&#xff0c;如果面试答得稀烂&#xff0c;人家根本不会要你。况且要不是大厂出来…

精品基于ssm的足球联赛管理系统的设计与实现vue

《基于ssm的足球联赛管理系统的设计与实现》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 前端技术&#xff1a;JavaScript、VUE.js&#xff08;2.X&#xff09;、css3 J…

记录一次服务器CPU负载高,利用率正常的处理方法

背景&#xff1a; 在一次查看服务器监控的时候偶然发现其中一台服务器的CPU负载很高&#xff0c;但是CPU利用率基本没有&#xff0c;通过top命令完全看不出来问题所在&#xff0c;经过一些思路的排查发现了原因并处理&#xff0c;现记录下来。 现象&#xff1a; top命令查看…

前端js手写面试题汇总(一)

实现prototype继承 所谓的原型链继承就是让新实例的原型等于父类的实例&#xff1a; //父方法 function SupperFunction(flag1){this.flag1 flag1; }//子方法 function SubFunction(flag2){this.flag2 flag2; }//父实例 var superInstance new SupperFunction(true);//子继…

刷了一个月leetcode算法,成功收下阿里巴巴、网易等大厂的offer

前言 有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西……透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30岁之后就要面临被优化的危险……想跳槽&#xff0c;但是更高的平台…

Linux常见的链接命令有几种?分别是什么?

链接命令是创建链接文件&#xff0c;链接文件分为软链接和硬链接&#xff0c;软链接的作用是方便文件的快速访问&#xff0c;而硬链接的作用是可以给重要文件创建硬链接能够防止文件数据被误删。 学习目标&#xff1a;能够说出软链接的创建方式和硬链接的创建方式。 教程推荐…