Проблемы с очередями Laravel (асинхронные функции) - PullRequest
1 голос
/ 25 апреля 2020

Я создал функцию Laravel с использованием очередей, но кажется, что она не работает, потому что я создал 10 PDF-файлов с использованием foreach, а также функцию с очередями, но время выполнения такое же.

Это моя функция с очередями:

$encuesta = Encuesta::where('id', $request->interes_id)
        ->with('empresa')
        ->first();

$personas = EncuestaPuntaje::where('encuesta_id', $request->interes_id)
        ->with('persona')
        ->with('puntajes.carrera')
        ->get();

if ($personas->isEmpty()) {
    return response()->json(['error' => 'No hay encuestas resueltas.'], 401);
} else {
    foreach ($personas as $p) {
        PDF::dispatchNow($p['persona'], $p['puntajes'], $encuesta['empresa']['nombre']);
    }

И это моя работа:

public function handle()
{
    $carreras = Carrera::where('estado', 1)->orderBy('nombre', 'asc')
        ->get();

    $content = \PDF::loadView('reporte_interes', array('carreras' => $carreras, 'persona' => $this->persona, 'puntajes' => $this->puntajes))->output();

    $name = 'PDF/'.$this->empresa . '/INTERESES/' . $this->persona->nombres . '' . $this->persona->apellido_paterno . '.pdf';
    \Storage::disk('public')->put($name,  $content);
}

Здесь я генерирую 1 файл:

введите описание изображения здесь

И здесь я генерирую 10 файлов:

введите описание изображения здесь

Я впервые использую очереди в Laravel, и я хотел, чтобы время было таким же.

1 Ответ

0 голосов
/ 26 апреля 2020

Код, который вы показали, использует dispatchNow(), но если вы , проверьте документы :

Если вы хотите отправить задание немедленно (синхронно), Вы можете использовать метод dispatchNow. При использовании этого метода задание не будет поставлено в очередь и будет немедленно запущено в текущем процессе

Так что dispatchNow действительно вообще не использует очереди. Задание запускается немедленно и поддерживает ваш внешний интерфейс (процесс управления) до тех пор, пока оно не будет выполнено, точно так же, как если бы вы вообще не использовали очереди. Вы не увидите никакого улучшения скорости.

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

PDF::dispatch($p['persona'], ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...