Перейти к содержимому

Пакетная обработка

Пакеты позволяют запускать группу заданий и отслеживать их как единое целое. Можно зарегистрировать обратные вызовы, которые срабатывают при успешном завершении всех заданий, сбое любого задания или завершении пакета независимо от результата. Queuety автоматически отслеживает ход выполнения, сбои и состояние отмены.

Создание пакета

Используйте Queuety::create_batch(), чтобы начать BatchBuilder. Передайте массив экземпляров Contracts\Job, затем вызовите dispatch(), чтобы создать запись пакета и все задания.

PHP
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 с состоянием пакета.

Вместо экземпляров заданий можно также передать массивы обработчиков и данных:

PHP
$batch = Queuety::create_batch( [
    [ 'handler' => 'import_users', 'payload' => [ 'chunk' => 1 ] ],
    [ 'handler' => 'import_users', 'payload' => [ 'chunk' => 2 ] ],
] )->dispatch();

Обратные вызовы

Зарегистрируйте классы обработчиков, которые будут вызываться на разных этапах жизненного цикла пакета. В каждом классе обработчика должен быть метод handle( Batch $batch ).

PHP
$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 ) Пакет завершен независимо от успеха или сбоя

Написание обработчика обратного вызова

PHP
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 срабатывал, даже если некоторые задания завершились с ошибкой.

PHP
$batch = Queuety::create_batch( $jobs )
    ->then( ReportHandler::class )
    ->allow_failures()
    ->dispatch();

Отслеживание хода выполнения

Объект-значение Batch предоставляет свойства и методы для отслеживания хода выполнения.

PHP
$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.

PHP
Queuety::batch_manager()->cancel( $batch_id );

При отмене пакет помечается как отмененный и завершенный, после чего срабатывает его обратный вызов finally. Задания при этом не затрагиваются: ожидающие задания в отмененном пакете продолжат выполняться, но их результаты больше не будут обновлять счетчики пакета или вызывать then, catch или finally. Удалите задания вручную, если их не нужно выполнять.

Поиск пакетов

Найти пакет по его ID:

PHP
$batch = Queuety::find_batch( $batch_id );

if ( null === $batch ) {
    // Batch not found.
}

Очистка старых пакетов

Удалите завершенные пакеты старше указанного количества дней:

PHP
$deleted = Queuety::batch_manager()->prune( 30 ); // Delete batches finished > 30 days ago

Удаляются только пакеты с ненулевой временной меткой finished_at. Активные пакеты никогда не очищаются.