centos/ubuntu/Mac中使用Supervisor监控管理laravel queue队列进程
Song •
6715 次浏览 •
2个评论 •
2018年02月27日
Supervisor是一个Linux操作系统上的进程监控软件,它会在queue:listen或queue:work命令发生失败后自动重启它们。
一、centos/ubuntu/Mac/pip安装supervisor
# centos安装supervisor
yum install -y supervisor
# Ubuntu安装supervisor
sudo apt-get install supervisor
# Supervisor是由Python写成,可以使用pip安装
sudo pip install supervisor
# Mac安装supervisor
brew install supervisor
二、简单使用supervisor监听laravel队列
假设我们开发好了一个队列,队列是基于reids,文件目录为/var/www/admin,如下为我们的使用代码:
由于不同系统文件路径不同,ubuntu位于/etc/supervisor/conf.d/新建文件,而centos需要在/etc/supervisord.conf中编辑
# ubuntu环境
vim /etc/supervisor/conf.d/test-report.conf
# centos环境
vim /etc/supervisord.conf
使用如下代码来启动与监控一个queue:work进程,其中tries代表最多尝试3次,否则一直执行;sleep代表无队列时休眠时间:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
autostart=true
autorestart=true
user=root
numprocs=8
redirect_stderr=true
stdout_logfile=/etc/supervisor/logs/admin-report.log
代码解释:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d ; 一个python字符串表达式,用来表示supervisor进程启动的这个的名称
command=php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3 ; 被监控的进程启动命令
autostart=true ; 随着supervisord的启动而启动
autorestart=true ; 自动重启.
user=root ; supervisord以root运行
numprocs=8 ; 启动几个进程
redirect_stderr=true ; 重定向stderr到stdout
stdout_logfile=/etc/supervisor/logs/worker.log ; 进程的标准输出写入文件中
三、启动Supervisor
当这个配置文件被创建后,你需要更新Supervisor的配置,并用以下命令来启动该进程:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
四、查看Supervisor进程是否有启动
ps -ef | grep artisan
出现如下表示启动成功,由于我们numprocs为8,所以启动8个进程;
root 31139 30647 0 15:04 ? 00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root 31140 30647 0 15:04 ? 00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root 31141 30647 0 15:04 ? 00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root 31142 30647 0 15:04 ? 00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root 31143 30647 0 15:04 ? 00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root 31144 30647 4 15:04 ? 00:00:05 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root 31145 30647 0 15:04 ? 00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root 31146 30647 0 15:04 ? 00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
五、常见问题与错误
1、laravel-worker: ERROR (no such group)
代表你的配置文件未找到,请检查文件路径是否正确
2、这里监听的队列应该是同一个队列 在这里是 sqs 。
是的,都是监听同一个队列。
3、开numprocs个监听进程,是否会造成两个任务并发执行的问题?
多个进程读取同一个队列,也不会读取到一样的数据;可以参考Laravel Redis 多个进程同时取队列问题。当多个worker同时监听的时候,实际上就是生产-消费的关系,在每个进程从队里中pop任务的时候都由Laravel根据不同的驱动提供不同的原子性支持,保证同一个任务不会被多进程同时消费(database驱动使用了事务,redis则使用Lua脚本获取/更新任务以保证原子性)
更多相关好文
-
[ laravel分页 ] laravel5.*带参数分页,自定义分页,获取总数以及列参数用法详解 2018-02-26 -
laravel如何修改默认的加密与解密方式? 2018-02-26 -
laravel 5.*进行支付宝同步/异步通知签名验证问题汇总 2018-02-13 -
[ laravel拓展 ] 使用laravel agent轻松识别客户端信息以及设备信息 2018-02-11 -
解决laravel出现Syntax error or access violation: 1055 '***' isn't in GROUP BY报错问题 2018-02-10

Laravel模型更新全表如何实现?