veilletech.fr
1 oct. Feed du jour
#06 LARAVEL Article

Laravel 13.34 : un worker qui plante compte enfin

Un worker qui meurt n'était pas une erreur. Il peut le devenir.

Laravel 13.34 permet de compter un worker tué en plein travail (mémoire, segfault, conteneur arrêté) comme une exception, ce qui arrête enfin les tâches en retryUntil qui abattent des workers en boucle. Les tâches Interruptible sont aussi prévenues par SIGALRM avant leur délai, et l'événement JobProcessed porte la durée de la tâche.

2 min de lectureintermédiairevidéo 1:15
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Un crash de worker qui compte
  3. Prévenir avant le délai
  4. Les autres ajouts utiles
  5. À retenir

Ce qui se passe

Laravel 13.34 soigne surtout les files de tâches : compter un worker mort comme une exception, prévenir une tâche avant son délai, mesurer sa durée, vider les échecs d'une seule file.

Un crash de worker qui compte

Une exception levée par une tâche incrémente $maxExceptions. Un worker tué en plein travail — mémoire épuisée, segfault, conteneur arrêté — ne l'incrémente pas. Une tâche bornée par retryUntil() et un limiteur de débit, plutôt que par $tries, peut ainsi abattre des workers en série jusqu'à son échéance.

Le nouvel attribut, apporté par William Julian-Vicary, change la règle pour les tâches qui l'adoptent :

app/Jobs/ImportCatalogue.phpPHP
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\Attributes\CountCrashesAsExceptions;
use Illuminate\Queue\Attributes\MaxExceptions;

#[MaxExceptions(2), CountCrashesAsExceptions]
class ImportCatalogue implements ShouldQueue
{
    public function retryUntil(): DateTime
    {
        return now()->addMinutes(30);
    }
}

La propriété public $countCrashesAsExceptions = true; produit le même effet. Le worker pose une clé en cache au début de la tentative et l'efface à la fin ; si la tentative suivante la trouve encore, la précédente est morte et compte pour une exception. Il faut une valeur maxExceptions, et chaque tentative coûte deux appels au cache — d'où l'adhésion explicite (#61737).

Prévenir avant le délai

Une tâche Interruptible recevait déjà SIGTERM et consorts, mais un dépassement de délai tuait le worker sans l'appeler. Elle reçoit désormais SIGALRM et peut enregistrer sa progression avant d'être marquée en échec. L'événement JobInterrupted (13.31) est émis aussi, et une exception levée dans interrupted() est rapportée sans retarder l'arrêt (#61651, Jack Bayliss).

PHP
public function interrupted(int $signal): void
{
    if ($signal === SIGALRM) {
        $this->checkpoint();
    }
}

Les autres ajouts utiles

Côté corrections : les verrous Memcached de plus de 30 jours expiraient aussitôt, DatabaseLock avalait les deadlocks dans une transaction, et le throttle Redis renvoyait un horodatage en guise d'essais restants.

Source : Count Worker Crashes as Job Exceptions in Laravel 13.34, Laravel News, 30 septembre 2026. Voir aussi le changelog.