Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Новини 14 серпня 2026

Призупинка всіх черг Laravel під час деплою

Під час більшості деплоїв існує часове вікно, коли код на диску вже змінився, але воркери, що працюють з ним, ще не перезапустилися. Воркер, який резервує завдання в цьому вікні, десеріалізує payload, створений старим кодом, і виконує його через новий код. У більшості випадків нічого не відбувається. Інколи перейменований клас завдання або змінена сигнатура конструктора перетворює його на failed job, який доводиться відтворювати вручну.

Звичайний спосіб вирішення - режим обслуговування (maintenance mode), який зупиняє набагато більше, ніж просто чергу, або queue:restart, що є радше запитом, аніж гарантією, оскільки воркер бачить його лише між завданнями. Laravel 13.25 додає третій варіант: перемикач, який зупиняє кожен воркер на кожному з'єднанні від резервування нової роботи, не торкаючись HTTP-трафіку.

Команди

Для призупинки всіх черг:

php artisan queue:pause --all

Для відновлення:

php artisan queue:resume --all

Аргумент queue в обох командах тепер необов'язковий, тому --all - єдине, що потрібно передати. Без прапорця команди поводяться як раніше і приймають пару connection:queue.

Той самий перемикач доступний у фасаді Queue для deploy-скриптів, написаних на PHP, або для контролера за адмін-панеллю:

use Illuminate\Support\Facades\Queue;
Queue::pauseAll();
// ...
Queue::resumeAll();

Як працює призупинка

Призупинена черга зупиняє воркерів від резервування нових завдань. Процес воркера залишається живим і продовжує цикл, він просто спить замість того, щоб витягувати завдання. Завдання, яке вже обробляється на момент призупинки, виконується до завершення, тому queue:pause --all у deploy-скрипті не перериває нічого на льоту. Продюсери також не постраждали: SomeJob::dispatch() продовжує записувати в Redis або базу даних, і ці завдання чекають там, поки ви не відновите чергу.

Механічно це один ключ кешу, illuminate:queues:paused, записаний через forever(). Воркери вже читають кеш один раз на цикл, щоб перевірити сигнали перезапуску та призупинки окремих черг, і глобальний ключ отримується в тому самому виклику many(), тому це не додає жодних додаткових звернень. QueueManager::isPaused() і getPausedQueues() обидва повідомляють чергу як призупинену, коли встановлено або глобальний ключ, або її власний ключ.

Два незалежні перемикачі

pause() і pauseAll() записують різні ключі, і вони навмисно не знають один про одного. Якщо чергу було призупинено індивідуально, resumeAll() залишає її призупиненою:

Queue::pause('redis', 'imports');   // припаркована, поки ми досліджуємо проблемне завдання
Queue::pauseAll();                  // деплой починається
Queue::resumeAll();                 // деплой завершується
Queue::isPaused('redis', 'imports'); // true

Це поведінка, яку ви хочете в deploy-скрипті. Хтось припаркував чергу imports навмисно годину тому, і деплой, що виконує resumeAll(), не повинен тихо скасовувати це. Очищення індивідуальної призупинки все ще вимагає queue:resume redis:imports.

Події

Дві події спрацьовують поряд із існуючими подіями для окремих черг QueuePaused і QueueResumed:

use Illuminate\Queue\Events\QueuesPaused;
use Illuminate\Queue\Events\QueuesResumed;
Event::listen(function (QueuesPaused $event) {
    Log::warning('All queues paused');
});
2

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Laravel AI SDK на практиці
Новини 09 жовтня 2026

Laravel AI SDK на практиці: агент, що стоїть за There There

Фрік Ван дер Гертен розповідає, як у Spatie побудували AI-шар хелпдеска There There на Laravel AI SDK: клас агента, інструменти з типізованою JSON-схемою та делегування роботи звичайним domain-діям.

9
CSRF і завантаження
Новини 09 жовтня 2026

Порада з безпеки: як завантаження файлів може обійти захист від CSRF

Стівен Ріс-Картер пояснює, чому файли користувачів варто віддавати з окремого домену: HTML і JS у межах основного застосунку дають доступ до cookie та CSRF-токенів.

18

Вакансії за темою

Wooden Sword
12 днів тому

Senior PHP Developer (Game Backend)

Розробник backend для мобільної RPG з високим навантаженням. Основний стек: PHP Laravel API та TypeScript Nakama Game Server. Відповідальність за повний цикл розробки функцій — від логіки до тестування, code review, оптимізації та документації. Вимоги: 5+ років backend-досвіду, бездоганне знання Laravel/PHP, сильні навички TypeScript, PostgreSQL та асинхронного програмування.

Пакети за темою

Laravel Web Tinker

spatie/laravel-web-tinker

Інтерактивна оболонка Artisan Tinker прямо у браузері для швидкого тестування та налагодження коду Laravel.

1,217 1.10.6 13 6

Laravel Prompts

laravel/prompts

Гарні інтерактивні поля для консольних команд: запити, паролі, вибір зі списку, автодоповнення і прогрес-бари з валідацією. Використовується самим Artisan і доступне у ваших командах.

721 v0.3.23 6