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.phpPHPuse 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).
public function interrupted(int $signal): void
{
if ($signal === SIGALRM) {
$this->checkpoint();
}
}Les autres ajouts utiles
JobProcessedexposedurationen millisecondes (flottant à deux décimales,nullhors du worker) : plus besoin d'écouterJobProcessingpour chronométrer.queue:flush --queue=sftp-sync, combinable avec--hours=48, ne vide que les échecs d'une file, par exemple après la panne d'une API tierce.Schema::getColumn('users', 'email')renvoie une seule colonne, ou un tableau vide si elle n'existe pas.assertDatabaseCount()accepte un tableau table → nombre.App::environment(),@envetenvironments()du planificateur acceptent des enums ; jusqu'ici, un enum passé àenvironments()empêchait la tâche planifiée de s'exécuter, sans erreur.Relation::requireMorphMap()s'applique aussi en lecture : un*_typeabsent de la carte lèveClassMorphViolationException, en chargement paresseux comme anticipé. Rien ne change sansrequireMorphMap().
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.