Я использую Laravel Excel (3.1 / Maatwebsite) для экспорта данных из моего приложения (Laravel 5.8) в файл Excel. Это работает, однако, процесс действительно медленный. Я проследил root проблемы до моего запроса. Запрос иногда занимает до 90 секунд из-за большого количества данных в моей базе данных. Запрос поступил из моего EmployeesExport класса и выглядит следующим образом:
public function query() {
return Employee::query()->whereHas('project', function($q){
$q->where('project_id', $this->id);
});
}
Я решил решить эту проблему, поставив в очередь экспорт , чтобы он был доступен для загрузки. позже, и мои пользователи могут продолжать работать. Поэтому я убедился, что мой EmployeesExport использует правильные классы / пространства имен / реализует и т.д. c:
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 вызывается (я ожидал поставить в очередь) в одном методе, который также сохраняет имя файла проекта в базе данных и перенаправляет обратно. Я сделал другой способ загрузить файл позже, когда он будет готов:
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);
}
Все это работает, однако процесс идет одинаково медленно. Я ожидал, что процесс встанет в очередь, поэтому я смогу продолжить работу в своем приложении и, возможно, отправлю электронное письмо, когда процесс будет завершен, чтобы я мог загрузить файл позже. Поэтому у меня есть следующие вопросы о моем коде в порядке важности:
- Как мне заставить мою очередь работать?
- Как я могу улучшить свой запрос, чтобы он был лучше / быстрее?
- Можно ли объединить очередь в очередь и загрузить (), чтобы моя загрузка происходила автоматически c, когда очередь / процесс завершены?