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 SendWelcomeEmailLaravel создаст класс:
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 allQueue и 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.logSupervisor автоматически перезапустит 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-проект - очереди становятся практически обязательной частью архитектуры.
Комментарии
Чтобы оставить комментарий, войдите в аккаунт.