Lors de la plupart des déploiements, une fenêtre existe où le code sur disque a changé mais les workers exécutent encore l'ancienne version. Les workers qui réservent des jobs durant cette fenêtre désérialisent des charges utiles de l'ancien code et les exécutent avec le nouveau code, provoquant parfois des défaillances lorsque les classes de jobs sont renommées ou que les signatures des constructeurs changent.

Laravel 13.25 répond à cela avec un commutateur de pause global qui arrête tous les workers sur toutes les connexions de réserver des jobs sans affecter le trafic HTTP. Les contournements traditionnels – le mode maintenance (qui arrête plus que les files d'attente) et queue:restart (une demande, pas une garantie) – sont maintenant complétés par cette solution dédiée.

La syntaxe des commandes est simple : php artisan queue:pause --all et php artisan queue:resume --all. L'argument queue devient optionnel ; sans --all, les commandes fonctionnent comme avant avec une paire connection:queue. La même fonctionnalité est disponible via la facade Queue pour les scripts de déploiement basés sur PHP ou les contrôleurs d'administration utilisant Queue::pauseAll() et Queue::resumeAll().

Mettant en pause, arrête les workers de réserver de nouveaux jobs mais garde les processus workers vivants et en boucle ; ils dorment simplement au lieu de traiter. Les jobs déjà traités lorsque la pause est invoquée s'exécutent jusqu'à la fin. Les producteurs restent inaffectés : SomeJob::dispatch() continue d'écrire dans Redis ou la base de données, et ces jobs restent en file d'attente jusqu'à la reprise.

L'implémentation utilise une seule clé de cache, illuminate:queues:paused, définie avec forever(). Les workers vérifient déjà une fois par boucle le cache pour les signaux de redémarrage et de pause par file, et la clé globale est extraite dans le même appel many(), n'ajoutant pas de round-trips supplémentaires. QueueManager::isPaused() et getPausedQueues() signalent une file comme mise en pause lorsque la clé globale ou sa clé individuelle est définie.

Les mécanismes de pause globale et individuelle sont indépendants. Si une file d'attente a été mise en pause individuellement avant le déploiement, resumeAll() la laisse en pause – un choix de conception délibéré. Quelqu'un peut avoir garé la file intentionnellement pour enquêter sur un job défectueux, et un déploiement automatisé ne doit pas annuler silencieusement les actions manuelles. L'effacement des pauses individuelles nécessite toujours queue:resume connection:queue.

Deux nouveaux événements accompagnent les événements existants par file QueuePaused et QueueResumed : QueuesPaused et QueuesResumed se déclenchent lors d'une mise en pause ou d'une reprise globale, permettant aux applications de journaliser ou surveiller ces actions de déploiement.

La fonctionnalité a été contribuée par Jack Bayliss dans la pull request #61126.