Пакетная обработка
Пакеты позволяют запускать группу заданий и отслеживать их как единое целое. Можно зарегистрировать обратные вызовы, которые срабатывают при успешном завершении всех заданий, сбое любого задания или завершении пакета независимо от результата. Queuety автоматически отслеживает ход выполнения, сбои и состояние отмены.
Создание пакета
Используйте Queuety::create_batch(), чтобы начать BatchBuilder. Передайте массив экземпляров Contracts\Job, затем вызовите dispatch(), чтобы создать запись пакета и все задания.
use Queuety\Queuety;
$batch = Queuety::create_batch( [
new ImportUsersJob( $csv_chunk_1 ),
new ImportUsersJob( $csv_chunk_2 ),
new ImportUsersJob( $csv_chunk_3 ),
] )
->name( 'Import users' )
->on_queue( 'imports' )
->dispatch();
echo $batch->id; // The batch ID
dispatch() возвращает объект-значение Batch с состоянием пакета.
Вместо экземпляров заданий можно также передать массивы обработчиков и данных:
$batch = Queuety::create_batch( [
[ 'handler' => 'import_users', 'payload' => [ 'chunk' => 1 ] ],
[ 'handler' => 'import_users', 'payload' => [ 'chunk' => 2 ] ],
] )->dispatch();
Обратные вызовы
Зарегистрируйте классы обработчиков, которые будут вызываться на разных этапах жизненного цикла пакета. В каждом классе обработчика должен быть метод handle( Batch $batch ).
$batch = Queuety::create_batch( $jobs )
->name( 'Import users' )
->then( ImportCompleteHandler::class )
->catch( ImportFailedHandler::class )
->finally( ImportCleanupHandler::class )
->dispatch();
| Метод | Когда вызывается |
|---|---|
then( $handler_class ) |
Все задания успешно выполнены (или задан параметр allow_failures()) |
catch( $handler_class ) |
Первое задание в пакете завершается с ошибкой |
finally( $handler_class ) |
Пакет завершен независимо от успеха или сбоя |
Написание обработчика обратного вызова
use Queuety\Batch;
class ImportCompleteHandler {
public function handle( Batch $batch ): void {
// All users imported. Send a notification.
error_log( "Batch {$batch->id} completed: {$batch->total_jobs} jobs processed." );
}
}
class ImportFailedHandler {
public function handle( Batch $batch ): void {
error_log( "Batch {$batch->id} had a failure. Failed jobs: {$batch->failed_jobs}" );
}
}
class ImportCleanupHandler {
public function handle( Batch $batch ): void {
// Runs regardless of outcome. Clean up temp files, etc.
}
}
Разрешение сбоев
По умолчанию обратный вызов then срабатывает, только если все задания пакета выполнены успешно. Вызовите allow_failures(), чтобы обратный вызов then срабатывал, даже если некоторые задания завершились с ошибкой.
$batch = Queuety::create_batch( $jobs )
->then( ReportHandler::class )
->allow_failures()
->dispatch();
Отслеживание хода выполнения
Объект-значение Batch предоставляет свойства и методы для отслеживания хода выполнения.
$batch = Queuety::find_batch( $batch_id );
$batch->progress(); // 0-100 percentage
$batch->finished(); // true if all jobs are done
$batch->has_failures(); // true if any job failed
$batch->cancelled(); // true if the batch was cancelled
$batch->total_jobs; // Total number of jobs
$batch->pending_jobs; // Jobs still pending
$batch->failed_jobs; // Number of failed jobs
$batch->failed_job_ids; // Array of failed job IDs
| Метод/свойство | Тип | Описание |
|---|---|---|
progress() |
int |
Процент выполнения от 0 до 100 |
finished() |
bool |
Завершен ли пакет (все задания выполнены или завершились с ошибкой) |
has_failures() |
bool |
Завершилось ли какое-либо задание пакета с ошибкой |
cancelled() |
bool |
Был ли пакет отменен |
$total_jobs |
int |
Общее количество заданий в пакете |
$pending_jobs |
int |
Количество ожидающих заданий |
$failed_jobs |
int |
Количество заданий, завершившихся с ошибкой |
$failed_job_ids |
array |
ID заданий, завершившихся с ошибкой |
$name |
string|null |
Необязательное имя пакета |
$created_at |
DateTimeImmutable |
Время создания пакета |
$finished_at |
DateTimeImmutable|null |
Время завершения пакета |
$cancelled_at |
DateTimeImmutable|null |
Время отмены пакета |
Отмена
Отмените пакет через BatchManager. При отмене пакета для параметров cancelled_at и finished_at устанавливается значение, после чего срабатывает обратный вызов finally.
Queuety::batch_manager()->cancel( $batch_id );
При отмене пакет помечается как отмененный и завершенный, после чего срабатывает его обратный вызов finally. Задания при этом не затрагиваются: ожидающие задания в отмененном пакете продолжат выполняться, но их результаты больше не будут обновлять счетчики пакета или вызывать then, catch или finally. Удалите задания вручную, если их не нужно выполнять.
Поиск пакетов
Найти пакет по его ID:
$batch = Queuety::find_batch( $batch_id );
if ( null === $batch ) {
// Batch not found.
}
Очистка старых пакетов
Удалите завершенные пакеты старше указанного количества дней:
$deleted = Queuety::batch_manager()->prune( 30 ); // Delete batches finished > 30 days ago
Удаляются только пакеты с ненулевой временной меткой finished_at. Активные пакеты никогда не очищаются.