尝试使用laravel在excel中导出大数据时显示超时

Posted

技术标签:

【中文标题】尝试使用laravel在excel中导出大数据时显示超时【英文标题】:show timeout when try to export large data in excel using laravel 【发布时间】:2021-11-18 17:31:45 【问题描述】:

我试图在我的 excel 中导出超过 10k 的数据,但它显示超时或有时显示未达到。在excel中导出大量数据的最佳过程是什么。在我给了mtycontroller和导出代码。

控制器:

function excel()
        return (new UsersExport())->download('invoices.xlsx');
    

在导出文件夹 UsersExport.php 文件中

<?php

namespace App\Exports;

use App\Models\TEST;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\FromArray;
use Illuminate\Contracts\Queue\ShouldQueue;

class UsersExport implements  FromQuery, WithMapping, WithHeadings,ShouldQueue

    /**
    * @return \Illuminate\Support\Collection
    */   
    use Exportable;

    public function query()
    
        return TEST::query()->where('status_id','!=','12');
    
    
    public function headings(): array
    
        return [
           'test Id', 'test Tracking Id','test Type','customer name', 'Receiver Info','Pickup','Delivery','cash','Charge','Status','cash Payment','Paid By','Request Time','Pickup Time','Delivery Time','Time Duration'
        ];
    
    
    public function map($row): array
    
      if($row->delivery == '0' || empty($row->delivery))
          $delivery = (!empty($row->branch->name)?$row->branch->name:'Not Available');
      else
          $delivery=(!empty(\App\Models\Branch::find($row->delivery)->name)?\App\Models\Branch::find($row->delivery)->name:'Not Available');
        

      $picks =\App\Models\TestLog::where('courier_id',$row->id)->where('status_id','13')->first();
        return [
             $row->id,
              $row->tracking_id,
              $row->test_type->title,
              !empty($row->customer->name)?$row->customer->name:"Not Available",
              $row->receiver_name.'-- '. $row->receiver_address .'-- '.$row->receiver_phone,
              !empty($row->pickup->name)?$row->pickup->name:"Not Available",
              !empty($delivery)?$delivery:"Not Available",
             $row->cash,
             $row->pricing->price,
             $row->status->name,
             $row->cash_status,
             $row->paid_by,
            date('d-m-Y h:i A',strtotime($row->created_at)),
             !empty($picks->created_at)?date('d-m-Y h:i A',strtotime($picks->created_at)):"Not Available",
            !empty($row->delivery_date)?date('d-m-Y h:i A',strtotime($row->delivery_date)):"Not Available",
             $row->created_at->diffForHumans()
        ];
      

代码没问题。它在数据量较少时导出数据,但在导出大量数据时会出现问题。请如果有人可以建议我在导出大数据时如何解决这个问题

【问题讨论】:

这种情况下最好分段导出数据 【参考方案1】:

是用户的浏览器声明超时。如果它必须等待 30 秒或更长时间,则认为该站点已损坏并向用户显示错误屏幕。

答案是在后台准备导出,作为一项工作。当用户请求导出时 - 多大或多小 - 将其推到工作中。该作业生成一个文件并将其保存到数据库中,并向用户发送作业完成的通知,可能会给他们一个指向该文件的链接(然后他们可以直接下载)或通知他们可以在哪里找到该文件(例如,如果过去的下载在管理面板中可用)。

【讨论】:

以上是关于尝试使用laravel在excel中导出大数据时显示超时的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5.8 中导入 excel 文件后无法管理文件数据

在 IBM netezza aginity sql 数据库工作台中导出大表时如何添加列名

在 laravel 中导出 excel 或 csv 中的多维数组

如何在 Laravel 中导入具有各种模型(和子数据/模型)的单个 excel 文件/工作表?

在Laravel中导入Excel文件,数据量太大,服务器经常500怎么办

如何使用 laravel 5.7 和 vue JS 在 mysql 中导入 excel 文件