РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1391 of 1392 menu

Класс WithoutOverlapping

Класс WithoutOverlapping представляет собой middleware для задач в очереди Laravel. Он предотвращает одновременное выполнение нескольких экземпляров одной и той же задачи. Это полезно, когда выполнение задачи занимает много времени или требует монопольного доступа к ресурсу.

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

Синтаксис

<?php use Illuminate\Queue\Middleware\WithoutOverlapping; // Базовое использование new WithoutOverlapping($key); // С дополнительными параметрами new WithoutOverlapping($key, $expiresAfter = 60, $releaseAfter = 10); ?>

Параметры конструктора:

key - ключ для идентификации задачи. Задачи с одинаковым ключом не будут выполняться одновременно.

expiresAfter - время жизни блокировки в секундах. По умолчанию 60 секунд.

releaseAfter - время в секундах, через которое задача будет повторно отправлена в очередь, если была пропущена из-за блокировки. По умолчанию 10 секунд.

Пример использования в задаче

Давайте создадим задачу, которая выполняет ресурсоёмкую операцию и не должна запускаться повторно до завершения предыдущего экземпляра:

<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\Middleware\WithoutOverlapping; class ProcessLargeFile implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $fileId; public function __construct($fileId) { $this->fileId = $fileId; } public function handle() { // Ресурсоёмкая операция обработки файла sleep(30); // Имитация длительной работы return "File processed successfully"; } public function middleware() { return [ new WithoutOverlapping($this->fileId) ]; } } ?>

Пример с настройками блокировки

Настроим блокировку с увеличенным временем жизни и автоматическим повторным запуском:

<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\Middleware\WithoutOverlapping; class UpdateReport implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $reportId; public function __construct($reportId) { $this->reportId = $reportId; } public function handle() { // Генерация отчёта return "Report generated"; } public function middleware() { $key = 'report_' . $this->reportId; $expiresAfter = 300; // 5 минут $releaseAfter = 30; // 30 секунд return [ new WithoutOverlapping($key, $expiresAfter, $releaseAfter) ]; } } ?>

Теперь, если задача с ключом 'report_1' уже выполняется, новая задача с этим же ключом будет автоматически отпущена на 30 секунд. Блокировка будет действовать 5 минут.

Пример вызова задачи с защитой

Отправим задачу в очередь с использованием класса WithoutOverlapping:

<?php namespace App\Http\Controllers; use App\Jobs\ProcessLargeFile; class FileController extends Controller { public function process($fileId) { // Отправляем задачу в очередь $job = new ProcessLargeFile($fileId); $job->dispatch(); return "Job dispatched successfully"; } } ?>

При множественном вызове этой задачи с одинаковым $fileId, только первый экземпляр выполнится полностью. Остальные будут отложены или пропущены, в зависимости от настройки releaseAfter.

Пример использования с динамическим ключом

Создадим задачу, которая блокирует выполнение на основе комбинации параметров:

<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\Middleware\WithoutOverlapping; class SyncData implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $userId; protected $dataType; public function __construct($userId, $dataType) { $this->userId = $userId; $this->dataType = $dataType; } public function handle() { // Синхронизация данных пользователя return "Data synced for user"; } public function middleware() { // Создаём уникальный ключ на основе параметров $key = 'sync_' . $this->userId . '_' . $this->dataType; return [ new WithoutOverlapping($key) ]; } } ?>

Теперь задачи с одинаковым userId и dataType не будут выполняться одновременно, что позволяет избежать конфликтов при синхронизации данных.

Смотрите также

  • интерфейс ShouldQueue,
    который указывает, что задача должна быть отправлена в очередь
  • интерфейс ShouldBeUnique,
    который обеспечивает уникальность задач в очереди
  • метод delay,
    который откладывает выполнение задачи на указанное время
  • метод push,
    который добавляет новую задачу в очередь
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить