首页 > 解决方案 > Laravel excel:下载速度慢,即使有队列

问题描述

我正在使用 Laravel Excel (3.1 / Maatwebsite) 将数据从我的应用程序 (Laravel 5.8) 导出到 excel 文件。这是有效的,但是,这个过程真的很慢。我已将问题的根源追溯到我的查询。由于我的数据库中有大量数据,查询有时需要长达 90 秒。该查询来自我的EmployeesExport类,如下所示:

public function query() {

    return Employee::query()->whereHas('project', function($q){
        $q->where('project_id',  $this->id);
    });
}

我决定通过对导出进行排队来解决这个问题,以便以后可以下载,我的用户可以继续工作。所以我确保我的EmployeesExport使用正确的类/命名空间/实现等:

namespace App\Exports;

use App\Employee;
use Illuminate\Contracts\Queue\ShouldQueue;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;

class EmployeesExport implements FromQuery, ShouldQueue {

    use Exportable;

    /**
     * @var int
     */
    private $id;

    public function __construct(int $id)
    {
        $this->id = $id;
    }

    /**
    * @return \Illuminate\Support\Collection
    */
    public function query() {

        return Employee::query()->whereHas('project', function($q){
            $q->where('project_id',  $this->id);
        });
    }

}

稍后,在类PrintController中,EmployeesExport以一种方法被调用(我预计是 queued ),该方法还将项目上的文件名存储在数据库中并重定向回来。我做了另一种方法来稍后下载文件:

public function getData(Project $project) {
        $name = '/data/project-' . $project->id . '-' . time() . '.xlsx';
        (new EmployeesExport($project->id))->store($name);

        $project->update(['datafile_name' => $name]);

        return redirect()->back()->with(['msg' => 'Export started!']);
    }

    public function downloadData(Project $project) {
        return \Storage::download($project->datafile_name);
    }

所有这些都有效,但是,这个过程同样缓慢。我希望进程能够排队,这样我就可以继续在我的应用程序中工作,并且可能会在进程完成后发送一封电子邮件,这样我以后就可以下载文件了。因此,按重要性排序,我对我的代码有以下问题:

  1. 我怎样才能让我的队列工作?
  2. 如何改进我的查询以更好/更快?
  3. 是否可以链接队列和下载(),以便在队列/进程完成时我的下载将自动发生?

标签: phpexcellaraveldownload

解决方案


推荐阅读