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

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

php -f consumer.php &,

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

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

1 ответ

Решение

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

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

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

Начальный руководитель

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

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

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

sudo supervisorctl start 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.

Другие вопросы по тегам