Как автоматизировать развертывание новых версий PHP-скрипта, работающего в фоновом режиме, без простоев?

У меня есть потребитель AMQP (потребитель RabbitMQ), написанный на PHP, всегда работающий в фоновом режиме. Этот сценарий запускается на нескольких узлах и 12 раз на каждом узле: выполняется 12 фоновых процессов unix:

php -f consumer.php &.

Если необходимо развернуть новую версию кода, на данный момент мне всегда приходится убивать ВСЕ эти процессы вручную и запускать их снова по одному, в каждой ноде.

  1. Есть ли способ автоматизировать развертывание фоновых сценариев? т.е. поместите его в конвейер развертывания, а затем перезагрузите, аналогично использованию https://deployer.org.
  2. Есть ли способ избежать простоев?
  3. Каким образом ReactPHP поможет в этом случае?

person Willian Schneider    schedule 23.10.2016    source источник
comment
Рассмотрим github.com/shaneharter/PHP-Daemon, в частности SIGHUP kill -1   -  person Clay    schedule 23.10.2016


Ответы (1)


Ответ найден в документах Laravel (решение работает для любого постоянно работающего фонового процесса , а не только PHP и Laravel). руководитель!

Настройка супервизора

Файлы конфигурации супервизора обычно хранятся в каталоге /etc/supervisor/conf.d. В этом каталоге вы можете создать любое количество конфигурационных файлов, которые сообщают супервизору, как следует отслеживать ваши процессы. Например, давайте создадим файл laravel-worker.conf, который запускает и отслеживает процесс queue:work:

Начальный супервайзер

После создания файла конфигурации вы можете обновить конфигурацию Supervisor и запустить процессы с помощью следующих команд:

sudo supervisorctl перечитать

обновление sudo supervisorctl

sudo supervisorctl запустить laravel-worker: *

Это даже поможет мне запустить столько процессов, сколько я хочу, с помощью одного файла конфигурации и одной команды. Опять же, из документов 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:*

Я просто интегрирую это как задачу Deployer в свой конвейер CI/CD.

person Willian Schneider    schedule 23.10.2016