当前位置:首页 > 后端 > php > 教你用ThinkPHP中thinkphp-queue

教你用ThinkPHP中thinkphp-queue

DChen3年前 (2021-04-27)php2.29 K0
1、安装 thinkphp-queue
     推荐使用composer进行安装,切换到项目的根目录,执行: composer require topthink/think-queue
2、配置消息队列的存储环境
    配置文件位于 application\extra\queue.php
使用redis驱动,如果Redis环境还没有安装,请自行安装哦,很简单的,或者也可以使用其他类型驱动
3、任务的创建
我们在index模块下,Index.PHP文件,建立一个名为 queue 的方法(一定要这样么?当然不是,本教程,只是例子,你可以新建模块,方法名也可以是其他):
class Index{
    public function queue(){
        //创建任务
        //当轮到该任务时,系统生成一个该类的实例,并调用其fire方法
        $jobHandlerClassName = "app\index\job\Demo";//注意:这里的规则是:项目命名空间\模块\文件夹\类名
        //当前任务归属的队列名称,如果为新队列,会自动创建
        $jobQueueName = "DemoJobQueue";
        //执行数据数组
        $jobData = ["ts"=>time()];
        //将该任务推送到消息队列,等待对应的消费者去执行
        $isPushed = Queue::push($jobHandlerClassName,$jobData,$jobQueueName);
    }
}
 4、任务消息的消费以及删除处理

我们在 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();
        }
    }
}

以上就是完成任务的创建-->推送-->消费了。

在浏览器或者终端,执行一下我们 index/queue.html 方法,就完成创建以及推送了,关于任务消费,可以参考一下命令,在终端切换到项目的根目录:

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 参数,原因下面会说明

linux启动守护进程,以tp5为例子

nohup php think queue:work --daemon --queue 任务名称 &
nohup php think queue:work --daemon --queue 任务名称 &

在Linux查看任务数量,可以在终端输入:jobs -l


取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

版权声明:本文由“憨小猪”发布,如需转载请注明出处。

本文链接:https://www.phper.red/post/66.html

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。