Чтобы обрабатывать большое количество заданий, я запускаю переменное число работников очереди в зависимости от того, какая работа должна завершиться. Я не хочу запускать больше рабочих, чем необходимо для завершения работы, которая должна быть выполнена за определенный промежуток времени, который мы считаем уместным.
На данный момент я запускаю 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
приведет к тому, что рабочие перезагрузятся после выполнения их текущего задания.