php守护进程composer,thinkphp+queue+supervisor队列消
息。。。
thinkphp5.1.36+queue2.0
1.thinkhphp安装queue扩展
直接在项⽬根⽬录运⾏ composer require topthink/think-queue
2.配置queue
安装完后会在config⽂件下⽣成⼀个queue.php⽂件,配置项如下:(使⽤的是redis驱动,服务器是linux,安装很⽅便,yum install redis)
return [
'connector' => 'Redis', // Redis 驱动
'expire' => 60, // 任务的过期时间,默认为60秒; 若要禁⽤,则设置为 null
'default' => 'default', // 默认的队列名称
'host' => '127.0.0.1', // redis 主机ip
'port' => 6379, // redis 端⼝
'password' => '', // redis 密码
'select' => 0, // 使⽤哪⼀个 db,默认为 db0
'timeout' => 0, // redis连接的超时时间
'persistent' => false, // 是否是长连接
];
3.创建任务
单模块项⽬推荐使⽤ app\job 作为任务类的命名空间 多模块项⽬可⽤使⽤ app\module\job 作为任务类的命名空间 也可以放在任意可以⾃动加载到的地⽅
任务类不需继承任何类,如果这个类只有⼀个任务,那么就只需要提供⼀个fire⽅法就可以了,如果有多个⼩任务,就写多个⽅法,下⾯发布任务的时候会有区别
每个⽅法会传⼊两个参数 think\queue\Job $job (当前的任务对象) 和 $data(发布任务时⾃定义的数据)
还有个可选的任务失败执⾏的⽅法 failed 传⼊的参数为$data(发布任务时⾃定义的数据)
namespace app\job;
use think\queue\Job;
class Job1{
public function fire(Job $job, $data){thinkphp3
//....这⾥执⾏具体的任务
if ($job->attempts() > 3) {
//通过这个⽅法可以检查这个任务已经重试了⼏次了
}
//如果任务执⾏成功后 记得删除任务,不然这个任务会重复执⾏,直到达到最⼤重试次数后失败后,执⾏failed⽅法
$job->delete();
// 也可以重新发布这个任务
$job->release($delay); //$delay为延迟时间
}
public function failed($data){
// ...任务达到最⼤重试次数后,失败了
}
}
4.发布任务
think\Queue::push($job, $data = '', $queue = null) 和 think\Queue::later($delay, $job, $data = '', $queue = null) 两个⽅法,前者是⽴即执⾏,后者是在 $delay 秒后执⾏
$job是任务名
单模块的,且命名空间是 app\job 的,⽐如上⾯的例⼦⼀,写Job1类名即可
多模块的,且命名空间是 app\module\job 的,写 model/Job1 即可
如果⼀个任务类⾥有多个⼩任务的话,需要⽤ @+⽅法名app\lib\job\Job2@task1、app\lib\job\Job2@task2
$data 是你要传到任务⾥的参数
$queue 队列名,指定这个任务是在哪个队列上执⾏,同下⾯监控队列的时候指定的队列名,可不填
5.安装supervisor
yum install supervisor
6.配置
安装好后在/etc/会⽣成⼀个f⽂件及⼀个supervisord.d⽂件⽬录
[unix_http_server]
file=/tmp/supervisor.sock ;UNIX socket ⽂件,supervisorctl 会使⽤
;chmod=0700 ;socket⽂件的mode,默认是0700
;chown=nobody:nogroup ;socket⽂件的owner,格式:uid:gid
;[inet_http_server] ;HTTP服务器,提供web管理界⾯
;port=127.0.0.1:9001 ;Web管理后台运⾏的IP和端⼝,如果开放到公⽹,需要注意安全性
;username=user ;登录管理后台的⽤户名
;password=123 ;登录管理后台的密码
[supervisord]
logfile=/tmp/supervisord.log ;⽇志⽂件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ;⽇志⽂件⼤⼩,超出会rotate,默认 50MB,如果设成0,表⽰不限制⼤⼩
logfile_backups=10 ;⽇志⽂件保留备份数量默认10,设为0表⽰不备份
loglevel=info ;⽇志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid ⽂件
nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的⽅式启动
minfds=1024 ;可以打开的⽂件描述符的最⼩值,默认 1024
minprocs=200 ;可以打开的进程数的最⼩值,默认 200
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file⼀致
; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令
autostart=true ; 在supervisord启动的时候也⾃动启动
startsecs=10 ; 启动10秒后没有异常退出,就表⽰进程正常启动了,默认为1秒
autorestart=true ; 程序退出后⾃动重启,可选值:[unexpected,true,false],默认为unexpected,表⽰进程意外杀死后才重启startretries=3 ; 启动失败⾃动重试次数,默认是3
user=tomcat ; ⽤哪个⽤户启动进程,默认是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=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括⼦进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括⼦进程
;包含其它配置⽂件
[include]
files = relative/directory/*.ini ;可以指定⼀个或多个以.ini结束的配置⽂件
最后⼀⾏,个⼈习惯命名conf,改为
[include]
files = relative/directory/*.conf
/etc/supervisord.d⽬录⽤来存放⽤户⾃定义的进程配置,参考:
command=php think queue:work --queue RecordJob --daemon ;执⾏命令
directory=/home/phpweb/gwjkj/ ;执⾏命令⽬录
user=phpweb ;执⾏命令⽤户
stdout_logfile=/opt/supervisor_log/run.log ;⽇志位置
autostart=true ;
autorestart=true ;
startsecs=60 ;
stopasgroup=true ;
ikillasgroup=true ;
startretries=1 ;
redirect_stderr=true ;
7.启动服务
service supervisord start 启动服务service supervisord stop 终⽌服务service supervisord restart 重启服务
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论