Laravel Queue для начинающих: как работают очереди и зачем они нужны

mr. Cooper 3 дня назад Веб-разработка
Laravel Queue для начинающих: как работают очереди и зачем они нужны

Очереди в Laravel - одна из самых полезных возможностей фреймворка для реальных проектов. Они позволяют переносить тяжелые задачи в фоновый режим и ускорять работу сайта для пользователей.

Если отправка email, генерация PDF, обработка изображений или работа с API выполняются прямо во время HTTP-запроса, страница начинает тормозить. Laravel Queue решает эту проблему: пользователь получает ответ мгновенно, а тяжелая задача выполняется отдельно в фоне.

В этой статье разберем, как работают очереди в Laravel, как их настроить и как использовать Jobs на практике.

Что такое Laravel Queue

Laravel Queue - это система фонового выполнения задач.

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

Например:

  • отправка писем;

  • обработка изображений;

  • экспорт Excel и CSV;

  • уведомления;

  • работа с AI API;

  • генерация отчетов;

  • импорт больших файлов.

Без очередей пользователь может ждать несколько секунд ответа сервера. С очередями сайт отвечает почти мгновенно.

Как работает Queue в Laravel

Схема работы достаточно простая.

Пользователь отправляет запрос → Laravel создает Job → Job попадает в очередь → Worker обрабатывает задачу в фоне.

Laravel поддерживает несколько драйверов очередей:

  • database

  • Redis

  • Amazon SQS

  • Beanstalkd

Для начала проще всего использовать database driver.

Настройка Queue в Laravel

Сначала создадим таблицу для очередей.

php artisan queue:table
php artisan migrate

После этого Laravel создаст таблицу jobs.

Теперь нужно указать драйвер очереди в .env.

QUEUE_CONNECTION=database

После изменения конфигурации Laravel начнет сохранять задачи в базу данных.

Создаем первую Job

Создадим Job через Artisan.

php artisan make:job SendWelcomeEmail

Laravel создаст класс:

app/Jobs/SendWelcomeEmail.php

Теперь добавим код выполнения задачи.

<?php

namespace App\Jobs;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Illuminate\Support\Facades\Mail;

class SendWelcomeEmail implements ShouldQueue
{
    use Queueable;

    public string $email;

    public function __construct(string $email)
    {
        $this->email = $email;
    }

    public function handle(): void
    {
        Mail::raw('Добро пожаловать!', function ($message) {
            $message->to($this->email)
                    ->subject('Welcome');
        });
    }
}

Интерфейс ShouldQueue говорит Laravel, что задача должна выполняться через очередь.

Отправляем Job в очередь

Теперь задачу можно отправить в очередь из контроллера.

use App\Jobs\SendWelcomeEmail;

SendWelcomeEmail::dispatch($user->email);

После dispatch задача попадет в таблицу jobs.

Но пока worker не запущен - задача не выполнится.

Запуск Queue Worker

Теперь нужно запустить worker.

php artisan queue:work

После запуска Laravel начнет обрабатывать задачи из очереди.

Если отправить Job снова, worker сразу выполнит задачу.

Почему Queue ускоряет Laravel

Представим ситуацию без очередей.

Пользователь регистрируется на сайте. Laravel одновременно:

  • отправляет email;

  • создает PDF;

  • генерирует аватар;

  • отправляет данные во внешний API.

Пока все это выполняется - пользователь ждет.

С очередями сервер отвечает сразу, а тяжелые операции выполняются отдельно. Это значительно улучшает UX и снижает нагрузку на приложение.

Пример обработки изображений через Queue

Очереди особенно полезны для работы с изображениями.

Например:

<?php

namespace App\Jobs;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Intervention\Image\Facades\Image;

class ResizeImage implements ShouldQueue
{
    use Queueable;

    public function __construct(
        public string $path
    ) {}

    public function handle(): void
    {
        Image::make(storage_path('app/' . $this->path))
            ->resize(1200, 800)
            ->save();
    }
}

Теперь загрузка файла не будет тормозить сайт.

Повторные попытки при ошибках

Laravel умеет автоматически повторять задачи при ошибках.

Например:

public int $tries = 3;

Laravel попробует выполнить Job три раза.

Можно также указать задержку:

public int $backoff = 10;

Повторная попытка произойдет через 10 секунд.

Отложенные задачи

Иногда задачу нужно выполнить позже.

Например, отправить письмо через час.

SendWelcomeEmail::dispatch($user->email)
    ->delay(now()->addHour());

Это удобно для уведомлений, напоминаний и email-рассылок.

Failed Jobs

Если задача окончательно завершилась ошибкой, Laravel может сохранить ее в таблицу failed_jobs.

Создаем таблицу:

php artisan queue:failed-table
php artisan migrate

Теперь failed jobs можно просматривать и перезапускать.

php artisan queue:retry all

Queue и Redis

Для production-проектов чаще используют Redis вместо database driver.

Redis работает значительно быстрее и лучше подходит для больших нагрузок.

Установка Redis:

composer require predis/predis

В .env:

QUEUE_CONNECTION=redis

После этого Laravel начнет использовать Redis для хранения очередей.

Supervisor для production

На VPS worker нельзя запускать вручную через терминал. Для этого используют Supervisor.

Пример конфигурации:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/project/artisan queue:work
autostart=true
autorestart=true
numprocs=1
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/project/worker.log

Supervisor автоматически перезапустит worker при падении сервера или ошибке процесса.

Laravel Horizon

Если проект использует Redis, стоит обратить внимание на Horizon.

Laravel Horizon позволяет отслеживать:

  • очереди;

  • скорость обработки;

  • failed jobs;

  • нагрузку;

  • workers.

Это один из самых удобных инструментов мониторинга в экосистеме Laravel.

Частые ошибки новичков

Одна из самых распространенных проблем - забытый worker. Job попадает в очередь, но не выполняется.

Также многие забывают про:

  • Supervisor;

  • failed jobs;

  • retries;

  • Redis для production;

  • разделение очередей по приоритетам.

Еще одна ошибка - выполнение слишком тяжелой логики внутри HTTP-запросов вместо очередей.

Итог

Laravel Queue - один из важнейших инструментов для масштабирования приложения. Даже небольшой проект становится заметно быстрее, если вынести тяжелые задачи в фоновые процессы.

Для старта достаточно database driver и команды queue:work, но со временем лучше перейти на Redis и Horizon.

Если вы делаете SaaS, API, AI-сервисы или крупный Laravel-проект - очереди становятся практически обязательной частью архитектуры.

Комментарии

Пока нет комментариев. Будьте первым, кто напишет.

Чтобы оставить комментарий, войдите в аккаунт.

Похожие статьи