# Supervisor 管理 yii2-queue 的 worker 进程

**URL:** <https://www.shiqidu.com/t/topic/757>\
**Category:** 开发调优\
**Tags:** CentOS\
**Created:** [2021 年10 月 14 日 08:00 UTC](https://www.shiqidu.com/t/topic/757 "2021-10-14T08:00:48Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

作者： ![Eureka](https://www.shiqidu.com/user_avatar/www.shiqidu.com/eureka/32/5_2.png) [@Eureka](https://www.shiqidu.com/u/Eureka)\
发布日期： [2021 年10 月 14 日 08:00 UTC](https://www.shiqidu.com/t/topic/757/1 "2021-10-14T08:00:48Z")

</div>

因为公司某块业务使用了消息队列（yii2-queue），今天产品反馈说业务延迟特别严重，所以怀疑是消息队列的问题，上线一看消息队列里有5000条任务在排队，以前只启用了一个worker进程，看来一个消费进程跑不及了，并且消息队列服务器的cpu和内存都是空闲的状态，所以想着多开几个worker来消费，以前一个worker进程的时候用crontab就管理了，现在多个进程这样肯定不太好，Yii官方[推荐使用Supervisor](https://github.com/yiisoft/yii2-queue/blob/master/docs/guide/worker.md)。

这里记录一下安装配置过程。

首先安装EPEL源

```bash
yum install epel-release

```

然后安装supervisor

```bash
yum install -y supervisor

```

设置supervisor开机启动

```bash
systemctl enable supervisord

```

启动supervisor

```bash
systemctl start supervisord

```

查看supervisor状态

```bash
systemctl status supervisord # 查看supervisord服务状态
ps -ef|grep supervisord # 查看是否存在supervisord进程

```

然后为我们的yii2-queue编写一个配置文件，位置位于 /etc/supervisord.d/

```bash
cd /etc/supervisord.d/
vim yiiQueue.ini

```

yiiQueue.ini内容如下

```auto
[program:yii-queue-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /你的yii项目根目录/yii queue/listen --verbose=1 --color=0
autostart=true
autorestart=true
user=www
numprocs=5
redirect_stderr=true
stdout_logfile=/var/log/yii-queue-worker.log

```

配置项解释

process\_name=: 进程名称  
command=; 运行程序的命令  
directory=; 命令执行的目录  
autorestart=; 程序意外退出是否自动重启  
autostart=; 是否自动启动  
stderr\_logfile=; 错误日志文件  
stdout\_logfile=; 输出日志文件  
user=; 进程执行的用户身份  
numprocs=；进程数量  
startsecs=; 自动重启间隔（S）

编写好之后保存退出，每次修改、新增、删除配置文件后，需要通知supervisor更新一下，加载新的配置

```bash
supervisorctl update

```

然后启动配置中的程序

```bash
supervisorctl reload

```

完事！最后看一下supervisor的状态

```bash
supervisorctl status

```

![supervisor的状态](https://discourse.shiqidu.com/uploads/default/original/1X/574e5ad2f009b84e83aa4543af28d834aea626d3.png)

可以看到我们的5个进程全部启动成功并且是running状态。要是实在不放心，可以看一下日志文件有没有正常再跑或者ps命令看一下有没有5个进程。

```bash
tail -f /var/log/yii-queue-worker.log

```

 ![运行日志](https://discourse.shiqidu.com/uploads/default/original/1X/aa5f29364278a3098af8a375e9fecc2e9b438224.png)

* * *

附一些supervisor常用命令

启动supervisord管理的所有进程

```bash
supervisorctl start all

```

停止supervisord管理的所有进程

```bash
supervisorctl stop all

```

启动supervisord管理的某一个特定进程

```bash
supervisorctl start program-name // program-name为[program:xx]中的xx

```

停止supervisord管理的某一个特定进程

```bash
supervisorctl stop program-name // program-name为[program:xx]中的xx

```

重启所有进程或所有进程

```bash
supervisorctl restart all // 重启所有
supervisorctl reatart program-name // 重启某一进程，program-name为[program:xx]中的xx

```

查看supervisord当前管理的所有进程的状态

```bash
supervisorctl status

```

> 参考链接 [https://blog.csdn.net/freedom\_fd/article/details/106387619](https://blog.csdn.net/freedom_fd/article/details/106387619)

---

<div class="post-metadata">

作者： ![yeqiu](https://www.shiqidu.com/user_avatar/www.shiqidu.com/yeqiu/32/14_2.png) [@yeqiu](https://www.shiqidu.com/u/yeqiu)\
发布日期： [2021 年10 月 17 日 15:29 UTC](https://www.shiqidu.com/t/topic/757/2 "2021-10-17T15:29:30Z")

</div>

谢谢，学到了。
