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

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

php -f consumer.php &,

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

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

2

Решение

Нашел ответ в Laravel docs (решение работает для любого всегда работающего фонового процесса, а не только для 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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]