Laravel queue:pause

Laravelqueue:pause
Solucionex
25
Ago 26

Si tienes workers corriendo en producción, seguramente conoces esta ventana incómoda: el código en disco ya ha cambiado, pero los workers todavía no se han reiniciado. Durante esos segundos un worker puede reservar un job cuyo payload serializó el código antiguo y ejecutarlo con el código nuevo. Si por el camino renombraste una clase, cambiaste la firma de un constructor o quitaste una propiedad, ese job falla. Y falla de una forma que suele ser difícil de reproducir después.

Laravel 13.25, publicado el 11 de agosto de 2026, añade una herramienta pensada exactamente para esto.

 

Pausa global

Poder pausar una cola ya existía desde la rama 12.x, pero con granularidad por cola:

php artisan queue:pause emails
php artisan queue:resume emails

El problema es que esa granularidad juega en tu contra en un deploy. Si tienes cinco colas repartidas entre Redis y SQS, tienes que acordarte de todas, y de añadirlas al script cada vez que alguien crea una nueva.

Ahora puedes pausar todo de golpe, en todas las conexiones:

php artisan queue:pause --all
php artisan queue:resume --all

Y lo mismo desde código, para scripts de despliegue en PHP o para un panel de administración:

use Illuminate\Support\Facades\Queue;

Queue::pauseAll();
Queue::resumeAll();

Qué hace exactamente cuando está pausado

Conviene tener claro qué significa "pausado" aquí, porque no es lo mismo que parar los workers:

  • Los workers siguen vivos. Simplemente dejan de reservar jobs nuevos y duermen en su bucle.
  • Los jobs que ya estaban ejecutándose terminan con normalidad. No se interrumpe nada a media ejecución.
  • Los productores siguen despachando. Los jobs se acumulan en la cola y se procesan cuando reanudas.

Por dentro es una única clave de caché (illuminate:queues:paused) que el worker consulta en cada vuelta del bucle, junto a las señales de reinicio que ya comprobaba. El coste añadido es prácticamente nulo.

En un script de deploy

El patrón es directo. Pausar, desplegar, reanudar:

php artisan queue:pause --all
git pull --ff-only
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache
php artisan queue:restart
php artisan queue:resume --all

Fíjate en que queue:restart sigue siendo necesario. La pausa evita que se reserven jobs mientras el código está a medio cambiar, pero son cosas distintas: `restart` le dice a los workers que terminen y se reinicien para cargar el código nuevo.

Si usas Envoy, Deployer o los hooks de despliegue de Forge o Cloud, colócalo igual: el pause como primer paso y el resume como último. Protege el resume para que se ejecute aunque algo falle por el camino, o te quedarás con las colas congeladas sin darte cuenta.

Eventos

Se añaden dos eventos nuevos, que conviven con los QueuePaused y QueueResumed por cola que ya existían:

  • QueuesPaused
  • QueuesResumed

Útiles para dejar rastro en el log o cualquier aplicación de seguimiento.

 

Fuentes

Pause All Laravel Queues During a Deploy, Laravel News
Pause All Queues and a New artisan dev UI in Laravel 13.25, Laravel News
Documentación oficial de Laravel