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

Класс ShouldQueue

Класс ShouldQueue является маркерным интерфейсом, который указывает системе очередей Laravel, что задача должна быть поставлена в очередь для асинхронной обработки. При реализации этого интерфейса в классе задачи, Laravel автоматически помещает её в очередь при вызове метода dispatch. Это позволяет разгрузить основной поток выполнения и выполнять ресурсоемкие операции (отправка писем, обработка изображений, генерация отчетов) в фоновом режиме.

Класс не требует реализации дополнительных методов, достаточно просто добавить его в объявление класса задачи. Система очередей сама обработает сериализацию, передачу данных и выполнение метода handle в воркере очереди.

Базовое использование

Рассмотрим простой пример создания задачи для отправки письма:

<?php namespace App\Jobs; use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class SendWelcomeEmail implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public $user; public function __construct(User $user) { $this->user = $user; } public function handle() { // Логика отправки письма echo "Welcome email sent to: " . $this->user->email; } } ?>

Теперь можно диспатчить задачу в очередь из любого места приложения:

<?php namespace App\Http\Controllers; use App\Models\User; use App\Jobs\SendWelcomeEmail; class UserController extends Controller { public function store() { $user = User::create([ 'name' => 'John Doe', 'email' => 'john@example.com' ]); SendWelcomeEmail::dispatch($user); return response()->json(['message' => 'User created']); } } ?>

Конфигурация очереди

Класс ShouldQueue можно комбинировать с различными атрибутами для тонкой настройки поведения задачи в очереди:

<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class ProcessReport implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public $data; public $tries = 5; public $timeout = 120; public $backoff = 10; public function __construct($data) { $this->data = $data; } public function handle() { // Тяжелая обработка данных echo "Processing report: " . $this->data; } } ?>

Пример с отправкой уведомления

Давайте создадим задачу для отправки уведомления пользователю о новом комментарии:

<?php namespace App\Jobs; use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class SendNotification implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public $user; public $message; public $connection = 'redis'; public $queue = 'high'; public function __construct(User $user, $message) { $this->user = $user; $this->message = $message; } public function handle() { echo "Notification sent to " . $this->user->email . ": " . $this->message; } } ?>

Диспатч задачи с указанием очереди и соединения:

<?php namespace App\Http\Controllers; use App\Models\User; use App\Jobs\SendNotification; class CommentController extends Controller { public function store() { $user = User::find(1); $message = 'New comment on your post'; SendNotification::dispatch($user, $message) ->onConnection('redis') ->onQueue('high'); return response()->json(['status' => 'Comment added']); } } ?>

Обработка ошибок

При использовании ShouldQueue можно определить метод failed для обработки ошибок выполнения задачи:

<?php namespace App\Jobs; use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Log; class SendWelcomeEmail implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public $user; public function __construct(User $user) { $this->user = $user; } public function handle() { // Логика отправки письма echo "Welcome email sent to: " . $this->user->email; } public function failed($exception) { Log::error('Job failed', [ 'user_id' => $this->user->id, 'error' => $exception->getMessage() ]); } } ?>

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

  • класс Job,
    который является базовым классом для всех задач очереди
  • метод handle,
    который содержит логику выполнения задачи в очереди
  • метод failed,
    который вызывается при неудачном выполнении задачи
  • функция dispatch,
    которая отправляет задачу в очередь
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить