Очереди в Laravel
Очереди в Laravel — это мощный инструмент, позволяющий обрабатывать задачи в фоновом режиме. Они помогают улучшить производительность приложения, избегая задержек при обработке ресурсоемких операций, таких как отправка писем, генерация отчетов или работа с API.
Что такое очереди?
Очередь — это механизм, позволяющий откладывать выполнение задач, помещая их в определенное хранилище (очередь), а затем обрабатывать их в фоне специальным обработчиком (worker). Laravel предоставляет удобный интерфейс для работы с очередями, позволяя легко их настраивать и использовать.Зачем использовать очереди?
- Улучшение производительности. Долговременные операции выполняются в фоне, а не замедляют работу приложения.
- Повышение отказоустойчивости. Если задача не удалась, её можно повторить.
- Снижение нагрузки на сервер. Распределение нагрузки между обработчиками очереди позволяет избежать перегрузки.
Как работают очереди в Laravel?
Настройка драйвера очереди
Laravel поддерживает несколько драйверов для работы с очередями:- Database (использование базы данных)
- Redis
- Beanstalkd
- Amazon SQS
- Sync (синхронное выполнение)
- Null (отключение очередей)
.env
:
Bash:
QUEUE_CONNECTION=database
Также следует выполнить миграцию для хранения очередей в базе данных:
Bash:
php artisan queue:table
php artisan migrate
Создание задачи (Job)
Чтобы создать новую задачу, используйте команду:
Bash:
php artisan make:job SendEmailJob
Этот класс создастся в
app/Jobs/SendEmailJob.php
. Внутри него реализуется метод handle
, который содержит логику выполнения задачи:
PHP:
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeQueued;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Mail;
use App\Models\User;
use App\Mail\WelcomeMail;
class SendEmailJob implements ShouldBeQueued
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function handle()
{
Mail::to($this->user->email)->send(new WelcomeMail($this->user));
}
}
Запуск задачи в очередь
Для добавления задачи в очередь используйте методdispatch
:
Bash:
SendEmailJob::dispatch($user);
Можно также задать задержку:
Bash:
SendEmailJob::dispatch($user)->delay(now()->addMinutes(10));
Запуск обработчика очереди
Обработчик очереди запускается командой:
Bash:
php artisan queue:work
Если требуется постоянно запущенный обработчик, используйте:
Bash:
php artisan queue:work --daemon
Повторное выполнение задач
Если задача завершилась с ошибкой, Laravel позволяет настроить повторные попытки:
Bash:
php artisan queue:retry all