Метод 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"