在Laravel队列中提到Supervisor,这里进行更多补充介绍、安装、使用。
当Laravel使用队列时候,需要有脚本常驻运行,这个时候可以用Supervisor将 php artisan queue:work 命令变为 后台运行并守护进程。
安装
备注:基于Mac系统安装,其它系统安装方法参考官网:http://supervisord.org/introduction.html#platform-requirements
$ brew install supervisor
安装过程若遇到权限问题,则执行 $ sudo brew install supervisor 命令;
安装完成之后,用命令查看版本
$ supervisord -v
3.3.5
启动
安装完成之后要启动,启动方法有多种
方法1:手动启动(刚开始学的时候,推荐方法),并指定主配置文件启动
supervisord -c /usr/local/etc/supervisord.ini
方法2:自动随系统启动(部署生产环境,推荐方法)
brew services start supervisor
在 supervisor 安装目录 /usr/local/Cellar/supervisor/3.3.5/bin 下有个“supervisorctl”客户端,supervisorctl 用于向 supervisord 发起命令。
启动 supervisorctl 客户端方法
supervisorctl -c /usr/local/etc/supervisord.ini
启动前必须在 /usr/local/etc/supervisord.ini 文件里去掉前面“;”注释,才能开启 supervisorctl。反之,启动报“http://localhost:9001 refused connection”问题。
启动 supervisorctl 客户端后,可以用浏览器打开输入用户名、密码后,进入web界面
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
username=root ; default is no username (open server)
password=123 ; default is no password (open server)
刚才提到主配置文件,如果在新增子配置,则在 supervisord.ini 文件末尾,
[include]
files = /usr/local/etc/supervisor.d/*.ini
supervisor.d 目录下创建新 子进程配置文件。
创建的子进程配置文件,如何启动呢?
先来介绍 supervisorctl 有哪些命令,如下所示。
reread ;重新加载配置文件
update ;将配置文件里新增的子进程加入进程组,如果设置了autostart=true则会启动新新增的子进程
status ;查看所有进程状态
status <name> ;查看指定进程状态
start all; 启动所有子进程
start <name>; 启动指定子进程
restart all; 重启所有子进程
restart <name>; 重启指定子进程
stop all; 停止所有子进程
stop <name>; 停止指定子进程
reload ;重启supervisord
add <name>; 添加子进程到进程组
reomve <name>; 从进程组移除子进程,需要先stop。注意:移除后,需要使用reread和update才能重新运行该进程
那么启动新创建子进程配置文件方法:
$ supervisorctl reread
$ supervisorctl update
如何查看子进程运行情况?
$ sudo supervisorctl
进入客户端输入用户名、密码后,如图所示,则可以查看子进程运行情况。
如何写 Supervisor 子进程文件
例子如下所示
[program:laravel-worker] ;[program:xx]是被管理的进程配置参数,tomcat是进程的名称
command=php /usr/local/var/www/laravel/artisan queue:work ;在supervisord启动的时候也自动启动
autostart=true ;在supervisord启动的时候也自动启动
startsecs=10 ;启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ;程序退出后自动重启,可选值:[unexpected,true,flase],默认为unexpected,表示进程意味杀死后才重启
startretries=3 ;启动失败自动重试次数,默认是3
user=root ;用哪个用户启动进程,默认是root
priority=999 ;进行启动优先级,默认999,值小的优先启动
redirect_stderr=true ;把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ;stdout日志文件大小,默认50MB
stdout_logfile_backups=20 ;stdout日志文件备份数,默认是10
;stdout日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord会自动创建日志文件)
stdout_logfile=/usr/local/var/www/laravel/storage/logs/queue.log
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
详情参考官网:http://supervisord.org/subprocess.html
Supervisor 应用场景有哪些
1、当经常有脚本需要常驻后台运行的时候。例如Laravel+Redis队列等待
2、将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。