如何在不停机的情况下自动部署在后台运行的新版本PHP脚本


How to automate the deployment of new versions of a PHP script running in the background without downtime?

我有一个用PHP编写的AMQP消费者(一个RabbitMQ消费者)总是在后台运行。该脚本在多个节点上运行,每个节点运行12次。

php -f consumer.php & .

如果必须部署新版本的代码,此时我总是必须手动终止所有这些进程,然后在每个节点上逐个重新启动它们。

  1. 是否有一种方法可以自动部署后台脚本?也就是说,把它放在一个部署管道中,然后让它们重新加载,类似于使用https://deployer.org。
  2. 是否有办法避免停机?
  3. 在这种情况下,ReactPHP有什么帮助吗?

在Laravel文档中找到了答案(解决方案适用于任何始终运行的后台进程,而不仅仅是PHP和Laravel)。主管!

配置主管

Supervisor配置文件通常保存在/etc/Supervisor/conf中。d目录。在这个目录中,您可以创建任意数量的配置文件,这些文件指导主管如何监视您的进程。例如,让我们创建一个启动并监视队列的larvel -worker.conf文件:

开始主管

配置文件创建后,您可以更新Supervisor配置并使用以下命令启动进程:

sudo superorctl reread

sudo superorctl update

sudo monitorctl start larvel -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:*

我将把它作为部署器任务集成到我的CI/CD管道中。