Laravel excel: медленная загрузка, даже с очередью - PullRequest
0 голосов
/ 27 марта 2020

Я использую 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);
    }

Все это работает, однако процесс идет одинаково медленно. Я ожидал, что процесс встанет в очередь, поэтому я смогу продолжить работу в своем приложении и, возможно, отправлю электронное письмо, когда процесс будет завершен, чтобы я мог загрузить файл позже. Поэтому у меня есть следующие вопросы о моем коде в порядке важности:

  1. Как мне заставить мою очередь работать?
  2. Как я могу улучшить свой запрос, чтобы он был лучше / быстрее?
  3. Можно ли объединить очередь в очередь и загрузить (), чтобы моя загрузка происходила автоматически c, когда очередь / процесс завершены?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...