Метод progress
Метод progress применяется к экземпляру класса Batch и возвращает целочисленное значение, представляющее процент выполнения пакетного задания. Метод не принимает никаких параметров и вычисляет прогресс на основе количества успешно выполненных заданий по отношению к общему количеству заданий в пакете.
Синтаксис
<?php
$batch->progress();
?>
Пример
Давайте создадим пакетное задание и выведем прогресс его выполнения:
<?php
namespace App\Http\Controllers;
use App\Jobs\ProcessDataJob;
use Illuminate\Support\Facades\Bus;
class BatchController extends Controller
{
public function index()
{
$jobs = [
new ProcessDataJob([1, 2, 3]),
new ProcessDataJob([4, 5, 6]),
new ProcessDataJob([7, 8, 9])
];
$batch = Bus::batch($jobs)->dispatch();
$progress = $batch->progress();
echo "Progress: $progress%";
}
}
?>
Результат выполнения кода:
"Progress: 0%"
Пример
Давайте получим прогресс пакетного задания с именем, которое мы задали при создании:
<?php
namespace App\Http\Controllers;
use App\Jobs\SendEmailJob;
use Illuminate\Support\Facades\Bus;
class BatchController extends Controller
{
public function show()
{
$batch = Bus::batch([
new SendEmailJob(1),
new SendEmailJob(2),
new SendEmailJob(3),
new SendEmailJob(4)
])->name('send_emails')->dispatch();
$progress = $batch->progress();
if ($progress < 100) {
echo "Batch is running: $progress%";
} else {
echo "Batch completed";
}
}
}
?>
Результат выполнения кода:
"Batch is running: 25%"
Пример
Давайте используем метод progress в сочетании с методами then и catch для отслеживания прогресса в реальном времени:
<?php
namespace App\Http\Controllers;
use App\Jobs\ProcessImageJob;
use Illuminate\Support\Facades\Bus;
class BatchController extends Controller
{
public function processImages()
{
$images = ['image1.jpg', 'image2.jpg', 'image3.jpg', 'image4.jpg'];
$jobs = [];
foreach ($images as $image) {
$jobs[] = new ProcessImageJob($image);
}
$batch = Bus::batch($jobs)->then(function () use (&$batch) {
echo "Batch completed with " . $batch->progress() . "% progress";
})->catch(function () use (&$batch) {
echo "Batch failed. Progress: " . $batch->progress() . "%";
})->dispatch();
return $batch->id;
}
}
?>
Результат выполнения кода:
"Batch completed with 100% progress"
Пример
Давайте создадим пакет с возможностью отмены и получим прогресс до и после отмены:
<?php
namespace App\Http\Controllers;
use App\Jobs\LongRunningJob;
use Illuminate\Support\Facades\Bus;
class BatchController extends Controller
{
public function cancelBatch()
{
$jobs = [
new LongRunningJob(1),
new LongRunningJob(2),
new LongRunningJob(3)
];
$batch = Bus::batch($jobs)->allowFailures()->dispatch();
$initialProgress = $batch->progress();
echo "Initial progress: $initialProgress%";
$batch->cancel();
$finalProgress = $batch->progress();
echo "After cancellation: $finalProgress%";
}
}
?>
Результат выполнения кода:
"Initial progress: 0%"
"After cancellation: 0%"