Batchverwerking
Met batches kun je een groep taken starten en ze als één geheel volgen. Je kunt callbacks registreren die worden uitgevoerd wanneer de batch is voltooid, wanneer een taak mislukt of wanneer de batch eindigt, ongeacht de uitkomst. Queuety houdt de voortgang, fouten en annuleringsstatus automatisch bij.
Een batch maken
Gebruik Queuety::create_batch() om een BatchBuilder te starten. Geef een array met instanties van Contracts\Job door en roep daarna dispatch() aan om de batchregel en alle taken aan te maken.
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() retourneert een waardeobject van Batch met de batchstatus.
Je kunt ook arrays met handler en inhoud doorgeven in plaats van taakinstanties:
$batch = Queuety::create_batch( [
[ 'handler' => 'import_users', 'payload' => [ 'chunk' => 1 ] ],
[ 'handler' => 'import_users', 'payload' => [ 'chunk' => 2 ] ],
] )->dispatch();
Callbacks
Registreer handlerklassen die op verschillende momenten in de levenscyclus van de batch worden aangeroepen. Elke handlerklasse moet een methode handle( Batch $batch ) hebben.
$batch = Queuety::create_batch( $jobs )
->name( 'Import users' )
->then( ImportCompleteHandler::class )
->catch( ImportFailedHandler::class )
->finally( ImportCleanupHandler::class )
->dispatch();
| Methode | Wanneer deze wordt uitgevoerd |
|---|---|
then( $handler_class ) |
Alle taken zijn succesvol voltooid (of allow_failures() is ingesteld) |
catch( $handler_class ) |
De eerste taak in de batch mislukt |
finally( $handler_class ) |
De batch eindigt, ongeacht of deze is geslaagd of mislukt |
Een callbackhandler schrijven
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.
}
}
Fouten toestaan
Standaard wordt de callback then alleen uitgevoerd als alle taken in de batch slagen. Roep allow_failures() aan om de callback then ook uit te laten voeren wanneer sommige taken mislukken.
$batch = Queuety::create_batch( $jobs )
->then( ReportHandler::class )
->allow_failures()
->dispatch();
Voortgang bijhouden
Het waardeobject Batch biedt eigenschappen en methoden om de voortgang bij te houden.
$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
| Methode/eigenschap | Type | Beschrijving |
|---|---|---|
progress() |
int |
Voltooiingspercentage van 0 tot 100 |
finished() |
bool |
Of de batch is beëindigd (alle taken zijn voltooid of mislukt) |
has_failures() |
bool |
Of er taken in de batch zijn mislukt |
cancelled() |
bool |
Of de batch is geannuleerd |
$total_jobs |
int |
Totaalaantal taken in de batch |
$pending_jobs |
int |
Aantal taken dat nog in behandeling is |
$failed_jobs |
int |
Aantal mislukte taken |
$failed_job_ids |
array |
ID's van de mislukte taken |
$name |
string|null |
Optionele batchnaam |
$created_at |
DateTimeImmutable |
Tijdstip waarop de batch is gemaakt |
$finished_at |
DateTimeImmutable|null |
Tijdstip waarop de batch is beëindigd |
$cancelled_at |
DateTimeImmutable|null |
Tijdstip waarop de batch is geannuleerd |
Annuleren
Annuleer een batch via de BatchManager. Door een batch te annuleren worden cancelled_at en finished_at ingesteld en de callback finally uitgevoerd.
Queuety::batch_manager()->cancel( $batch_id );
Door annulering wordt de batch als geannuleerd en beëindigd gemarkeerd en de callback finally uitgevoerd. De taken blijven ongemoeid: taken die nog in behandeling zijn in een geannuleerde batch worden nog uitgevoerd, maar hun resultaten werken de batchtellers niet meer bij en activeren then, catch of finally niet. Verwijder de taken zelf als ze niet mogen worden uitgevoerd.
Batches zoeken
Een batch opzoeken aan de hand van de ID:
$batch = Queuety::find_batch( $batch_id );
if ( null === $batch ) {
// Batch not found.
}
Oude batches opruimen
Verwijder beëindigde batches die ouder zijn dan een opgegeven aantal dagen:
$deleted = Queuety::batch_manager()->prune( 30 ); // Delete batches finished > 30 days ago
Alleen batches met een niet-null finished_at-tijdstempel worden verwijderd. Actieve batches worden nooit opgeruimd.