Laravel Artisan CLI безопасно останавливает работников очереди демонов

Чтобы обрабатывать большое количество заданий, я запускаю переменное число работников очереди в зависимости от того, какая работа должна завершиться. Я не хочу запускать больше рабочих, чем необходимо для завершения работы, которая должна быть выполнена за определенный промежуток времени, который мы считаем уместным.

На данный момент я запускаю 5 рабочих очереди демонов для тестирования, однако в производстве это число может составлять от 25 до 100 человек, возможно, больше. Я понимаю, что при развертывании мне приходится останавливать рабочих очередей, сначала помещая фреймворк в режим обслуживания, используя php artisan down , потому что флаг --daemon заставляет фреймворк загружаться только тогда, когда рабочий запускается, следовательно, новый код не будет влияют на развертывание, пока рабочий не перезапустится.

Если мне почему-то нужно было остановить рабочих, я мог бы поместить приложение в режим обслуживания, используя php artisan down который заставит рабочих умереть, как только они закончат обработку своего текущего задания (если они работают). Однако могут быть случаи, когда я хочу убить рабочих, не помещая все приложение в режим обслуживания.

Есть ли безопасный способ остановить рабочих таким образом, чтобы они продолжали обрабатывать свою текущую работу, а затем умереть, не помещая все приложение в режим обслуживания?

По сути, мне нужна php artisan queue:stop , которая ведет себя как php artisan queue:restart , но не перезагружает рабочего после выполнения задания.

Я делал вывод, что это будет такая же php artisan queue:stop которая будет делать это, но это, похоже, не так.

Использование ps aux | grep php ps aux | grep php Я могу получить идентификатор процесса для рабочих, и я мог бы убить процессы таким образом, но я не хочу убивать процесс в середине работы над работой.

Благодарю.

Мы реализовали что-то подобное в нашем приложении, но это не было тем, что было встроено в Laravel. Вам нужно будет отредактировать этот файл , добавив другое условие в if-блок, чтобы он вызывал функцию stop . Вы можете сделать это, установив статическую переменную в классе Worker которая будет изменяться всякий раз, когда вы запускаете настраиваемую команду, которую вы должны будете сделать (например, php artisan queue:pause ) или путем проверки атомного значения где-нибудь (то есть установите его в некоторый кеш, такой как redis, memcached, APC или даже MySQL, хотя это будет означать, что у вас будет один запрос MySQL для каждого цикла этого цикла while), который вы задаете с помощью той же пользовательской команды.

При использовании флага --daemon работники не должны уходить, когда очередь пуста.

Я думаю, что вы ищете в документации для очередей.

Команда php artisan queue:restart приведет к тому, что рабочие перезагрузятся после выполнения их текущего задания.