Информация Очереди в Laravel

laravel-queue.png

Очереди в 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

Заключение​

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

shinoa

Известный
298
207
Гайд для какой версии и какого года? Из функционала очередей описано лишь 5%, часть которой вводит в заблужение
  • Флаг --daemon устарел еще в Laravel 5.3 (~8 лет задержка)
  • Через секунду после закрытия консоли обработчик очередей перестанет работать. Laravel прямо пишет в документации:
    To keep the queue:work process running permanently in the background, you should use a process monitor such as Supervisor to ensure that the queue worker does not stop running.
  • Laravel по умолчанию использует sync драйвер для очередей, а он не поддерживает delay(), любые задачи выполняются мгновенно
 
  • Нравится
Реакции: vmprotect