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

Метод batch

Метод batch класса Bus применяется для группового выполнения нескольких задач в очереди. Он принимает массив объектов задач и возвращает экземпляр класса Batch, который позволяет отслеживать прогресс выполнения группы, добавлять колбэки на успех или ошибку, а также отменять выполнение всей группы. Первым параметром передаётся массив задач, вторым - необязательное имя группы.

Синтаксис

<?php use Illuminate\Support\Facades\Bus; $batch = Bus::batch($jobs, $name = null); ?>

Пример

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

<?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 ProcessJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $id; public function __construct($id) { $this->id = $id; } public function handle() { // Обработка задачи с идентификатором echo "Processing id: " . $this->id; } } ?>
<?php namespace App\Http\Controllers; use App\Jobs\ProcessJob; use Illuminate\Support\Facades\Bus; class BatchController extends Controller { public function createBatch() { $jobs = [ new ProcessJob(1), new ProcessJob(2), new ProcessJob(3), ]; $batch = Bus::batch($jobs)->dispatch(); return $batch->id; } } ?>

Результат выполнения кода:

"Batch created with ID: 123"

Пример

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

<?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 SendEmailJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $email; public function __construct($email) { $this->email = $email; } public function handle() { // Отправка email echo "Email sent to: " . $this->email; } } ?>
<?php namespace App\Http\Controllers; use App\Jobs\SendEmailJob; use Illuminate\Support\Facades\Bus; use Illuminate\Support\Facades\Log; class BatchController extends Controller { public function processEmails() { $jobs = [ new SendEmailJob('user1@example.com'), new SendEmailJob('user2@example.com'), new SendEmailJob('user3@example.com'), ]; $batch = Bus::batch($jobs) ->name('Email Processing') ->then(function ($batch) { // Все задачи выполнены успешно Log::info('All emails processed successfully'); }) ->catch(function ($batch, $e) { // Произошла ошибка в одной из задач Log::error('Batch failed: ' . $e->getMessage()); }) ->finally(function ($batch) { // Выполняется всегда после завершения группы Log::info('Batch finished'); }) ->dispatch(); return $batch->id; } } ?>

Результат выполнения кода:

"Batch started with ID: 456"

Пример

Добавим задачи с задержкой и ограничением количества попыток:

<?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 NotificationJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public $tries = 3; // Максимальное количество попыток protected $userId; public function __construct($userId) { $this->userId = $userId; } public function handle() { // Отправка уведомления пользователю echo "Notification sent to user: " . $this->userId; } } ?>
<?php namespace App\Http\Controllers; use App\Jobs\NotificationJob; use Illuminate\Support\Facades\Bus; class BatchController extends Controller { public function sendNotifications() { $jobs = [ new NotificationJob(1), new NotificationJob(2), new NotificationJob(3), new NotificationJob(4), new NotificationJob(5), ]; $batch = Bus::batch($jobs) ->name('User Notifications') ->allowFailures() // Разрешить продолжение при ошибках ->onQueue('high') // Установить очередь для всех задач ->dispatch(); return $batch->id; } } ?>

Результат выполнения кода:

"Notifications batch ID: 789"

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

  • метод then,
    который выполняет колбэк после успешного завершения группы
  • метод catch,
    который обрабатывает ошибки в группе задач
  • метод progress,
    который возвращает прогресс выполнения группы
  • метод chain,
    который создает цепочку последовательных задач
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить