php - 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);
}
所有这些都有效,但是,这个过程同样缓慢。我希望进程能够排队,这样我就可以继续在我的应用程序中工作,并且可能会在进程完成后发送一封电子邮件,这样我以后就可以下载文件了。因此,按重要性排序,我对我的代码有以下问题:
- 我怎样才能让我的队列工作?
- 如何改进我的查询以更好/更快?
- 是否可以链接队列和下载(),以便在队列/进程完成时我的下载将自动发生?
解决方案
推荐阅读
- python - 无法使用 Subprocess Popen 为应用程序启动 Instruments 'Time Profiler'
- javascript - 如何使用 javascript 创建图像和文本的搜索栏
- spring - Spring Batch Partitions Join 覆盖 RowMapper 值,因此得到单个数组而不是多个
- java - 如何检查用户输入是java中的float还是int?
- java - 工具栏幻灯片动画中的后退箭头不起作用
- java - 在java中以正确的方式获取“百分比哈希码”
- node.js - 使用 fluent-ffmpeg 添加背景音乐
- xml - 如何在不使用 OpenSAML Jar 的情况下解析 SAML 2.0 响应
- sql - 尝试将 SQL 查询的值分配给变量 SET
- jupyter-notebook - 如何使用 Julia 在 Jupyter Notebook 中抑制单元格的输出