【问题标题】:How to automate the deployment of new versions of a PHP script running in the background without downtime?如何在不停机的情况下自动部署在后台运行的 PHP 脚本的新版本?
【发布时间】:2017-03-05 01:07:39
【问题描述】:
我有一个用 PHP 编写的 AMQP 消费者(RabbitMQ 消费者)始终在后台运行。此脚本在多个节点中运行,每个节点运行 12 次:运行 12 个 unix 后台进程:
php -f consumer.php &.
如果必须部署新版本的代码,目前我总是必须手动终止所有这些进程并在每个节点中一个接一个地再次启动它们。
- 有没有办法自动部署后台脚本? IE。将其放入部署管道,然后重新加载它们,类似于使用 https://deployer.org。
- 有没有办法避免停机?
- 在这种情况下,ReactPHP 有什么帮助吗?
【问题讨论】:
标签:
php
bash
rabbitmq
amqp
php-deployer
【解决方案1】:
在Laravel docs 中找到了答案(该解决方案适用于任何始终运行的后台进程,而不仅仅是 PHP 和 Laravel)。 Supervisor!
配置主管
Supervisor 配置文件通常存储在 /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 管道中。