教你用ThinkPHP中thinkphp-queue
class Index{ public function queue(){ //创建任务 //当轮到该任务时,系统将生成一个该类的实例,并调用其fire方法 $jobHandlerClassName = "app\index\job\Demo";//注意:这里的规则是:项目命名空间\模块\文件夹\类名 //当前任务归属的队列名称,如果为新队列,会自动创建 $jobQueueName = "DemoJobQueue"; //执行数据是数组 $jobData = ["ts"=>time()]; //将该任务推送到消息队列,等待对应的消费者去执行 $isPushed = Queue::push($jobHandlerClassName,$jobData,$jobQueueName); } }
我们在 index模块下创建一个 job 文件夹还有Demo.Php类,该文件用来处理消费模式
在 Demo 这个类下,创建一个 fire 方法,该方法是消息队列默认调用的方法。
public function fire(Job $job,$data){ //比如:完成某个场景,将队列删除等等 $job->delete(); if(true){ //如果任务执行成功,记得删除任务 $job->delete(); print("<info>删除队列"."</info\n>"); }else{ if($job->attempts() > 3){ //通过这个方法可以检查这个任务已经重试了几次了 print("<warn>测试一下"."</warn>\n"); $job->delete(); } } }
以上就是完成任务的创建-->推送-->消费了。
5、监听任务并执行
php think queue:listen php think queue:work –daemon(不加–daemon为执行单个任务)
两种,具体的可选参数可以输入命令加 –help 查看
可配合supervisor使用,保证进程常驻
1.1 命令模式
queue:subscribe 命令 [截至2017-02-15,作者暂未实现该模式,略过]
queue:work 命令
work 命令:该命令将启动一个 work 进程来处理消息队列。
php think queue:work --queue helloJobQueue
queue:listen 命令
listen 命令:该命令将会创建一个 listen 父进程 ,然后由父进程通过 proc_open(‘php think queue:work’)
的方式来创建一个work 子 进程来处理消息队列,且限制该work进程的执行时间。
php think queue:listen --queue helloJobQueue
2.2 命令行参数
Work 模式
php think queue:work \ --daemon //是否循环执行,如果不加该参数,则该命令处理完下一个消息就退出 --queue helloJobQueue //要处理的队列的名称 --delay 0 \ //如果本次任务执行抛出异常且任务未被删除时,设置其下次执行前延迟多少秒,默认为0 --force \ //系统处于维护状态时是否仍然处理任务,并未找到相关说明 --memory 128 \ //该进程允许使用的内存上限,以 M 为单位 --sleep 3 \ //如果队列中无任务,则sleep多少秒后重新检查(work+daemon模式)或者退出(listen或非daemon模式) --tries 2 //如果任务已经超过尝试次数上限,则触发‘任务尝试次数超限’事件,默认为0
Listen 模式
php think queue:listen \ --queue helloJobQueue \ //监听的队列的名称 --delay 0 \ //如果本次任务执行抛出异常且任务未被删除时,设置其下次执行前延迟多少秒,默认为0 --memory 128 \ //该进程允许使用的内存上限,以 M 为单位 --sleep 3 \ //如果队列中无任务,则多长时间后重新检查,daemon模式下有效 --tries 0 \ //如果任务已经超过重发次数上限,则进入失败处理逻辑,默认为0 --timeout 60 //创建的work子进程的允许执行的最长时间,以秒为单位
可以看到 listen 模式下,不包含
--deamon
参数,原因下面会说明
nohup php think queue:work --daemon --queue 任务名称 & nohup php think queue:work --daemon --queue 任务名称 &
在Linux查看任务数量,可以在终端输入:jobs -l
版权声明:本文由“憨小猪”发布,如需转载请注明出处。