Как автоматизировать развертывание новых версий PHP-скрипта, работающего в фоновом режиме, без простоев?
У меня есть потребитель AMQP (потребитель RabbitMQ), написанный на PHP , всегда активный, работающий в фоновом режиме . Этот скрипт запускается на нескольких узлах и 12 раз на узел: 12 запущенных фоновых процессов unix:
php -f consumer.php &
.
Если необходимо развернуть новую версию кода, на данный момент мне всегда приходится вручную отключать ВСЕ эти процессы и запускать их снова один за другим в каждом узле.
- Есть ли способ автоматизировать развертывание фоновых сценариев? Т.е. поместите его в конвейер развертывания, а затем перезагрузите их, аналогично использованию https://deployer.org.
- Есть ли способ избежать простоя?
- Каким образом ReactPHP поможет в этом случае?
1 answers
Нашел ответ в документах Laravel (решение работает для любого всегда запущенного фонового процесса, а не только для PHP и Laravel). Руководитель!
Настройка супервизора
Файлы конфигурации супервизора обычно хранятся в каталоге /etc/supervisor/conf.d. В этом каталоге вы можете создать любое количество файлов конфигурации, которые будут указывать супервизору, как следует отслеживать ваши процессы. Например, давайте создадим laravel-файл worker.conf, который запускает и отслеживает очередь: рабочий процесс:
Стартовый супервайзер
После создания файла конфигурации вы можете обновить конфигурацию супервизора и запустить процессы, используя следующие команды:
Sudo supervisorctl перечитал
Обновление Sudo supervisorctl
Sudo supervisorctl запускает laravel-работника:*
Это даже поможет мне запустить столько процессов, сколько я захочу, с помощью одного файл конфигурации и одна команда. Опять же, из документов Laravel:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
При вызове sudo supervisorctl start laravel-worker:*
запустится 8 фоновых процессов, которые также перезапустятся в случае ошибки.
Если я просто хочу перезапустить с новой выпущенной версией, я вызываю команду restart
напрямую:
supervisorctl restart laravel-worker:*
Я просто интегрирую это как задачу развертывания в свой конвейер CI/CD.