veilletech.fr
10 sept. Feed du jour
#09 LARAVEL Article

Laravel 13.31 compte toute une file d'un coup

Une interruption qui ne dit rien est une interruption qu'on découvre trop tard.

Laravel 13.31.0, sortie le 8 septembre, ajoute Queue::totalSize() pour compter tous les jobs d'une connexion en un appel, un événement JobInterrupted émis quand le worker stoppe un job interruptible, et le support de chaperone() sur les modèles pivots d'une relation BelongsToMany. Côté tests, quatre nouvelles assertions « once » remplacent la vérification de compteurs pour les mails et les notifications.

2 min de lectureintermédiairevidéo 1:20
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. Compter une file en un appel
  3. Savoir qu'un job a été interrompu
  4. chaperone() sur les pivots
  5. Ce qui compte aussi
  6. À retenir

Ce qui se passe

Laravel 13.31.0 est sortie le 8 septembre 2026. Trois ajouts sortent du lot, tous orientés production plutôt que confort d'écriture.

Compter une file en un appel

Queue::totalSize(), proposé par Jack Bayliss (#61373), répond à une question qu'on posait jusqu'ici en trois fois :

PHP
// avant
Queue::totalPendingSize() + Queue::totalDelayedSize() + Queue::totalReservedSize();

// après
Queue::totalSize();

L'intérêt n'est pas l'économie de deux appels, c'est la justesse dans le temps : une addition maison ment le jour où une catégorie s'ajoute, et personne ne s'en aperçoit — un tableau de bord ne lève pas d'exception, il affiche un chiffre trop bas.

Savoir qu'un job a été interrompu

Le nouvel événement JobInterrupted (#61412, Jack Bayliss) est émis quand un job portant le contrat Interruptible est interrompu par le worker — typiquement lors d'un redéploiement, quand le worker reçoit son signal d'arrêt.

PHP
use Illuminate\Queue\Events\JobInterrupted;

Event::listen(JobInterrupted::class, function (JobInterrupted $event) {
    // libérer un verrou, refermer un fichier temporaire, journaliser
});

Sans ce point d'accroche, une interruption ne laissait aucune trace : le job n'avait ni échoué ni réussi, il s'était simplement arrêté. C'est exactement le genre de silence qu'on découvre trois semaines plus tard, en cherchant pourquoi un verrou n'a jamais été relâché.

chaperone() sur les pivots

Caleb White (#61152) étend chaperone() aux modèles pivots d'une relation BelongsToMany. Le problème qu'il résout est précis : avec un pivot personnalisé, remonter au parent depuis le pivot recharge les modèles depuis la base — alors que les deux étaient déjà disponibles au moment de l'hydratation de la relation.

PHP
class Tag extends Model
{
    public function posts(): BelongsToMany
    {
        return $this->belongsToMany(Post::class)
            ->using(PostTagPivot::class)
            ->chaperone(); // devine les noms de relations
            // ou, si les noms sont non standards :
            // ->chaperone(declaring: 'tag', related: 'post');
    }
}

Sans modèle pivot personnalisé, l'appel est un no-op — il ne coûte rien à écrire par défaut.

Ce qui compte aussi

Trois correctifs valent une relecture de vos propres usages : lazy() et lazyById() ignoraient limit() et offset() (#61402), une fuite mémoire est colmatée dans le client HTTP (#61438), et le middleware RateLimited touchait des limites qui ne bloquaient pas le job (#61449).

À retenir

C'est une version mineure : rien ne casse, rien ne presse. Mais si vous supervisez vos files, totalSize() remplace votre addition maison en cinq minutes — et si vos jobs prennent des verrous, JobInterrupted mérite un écouteur avant le prochain déploiement.

Source : Queue totalSize() and JobInterrupted Event in Laravel 13.31