Thinkphp使用消息队列Queue

Thinkphp使用消息队列Queue。我的ThinkPHP版本是5.0

使用composer安装queue包,命令行进入到项目的根目录,输入:

composer require topthink/think-queue

安装完在项目生成了application/extra/queue.php文件,这个是配置消息队列,这里使用redis作为驱动,配置修改为下面内容:

<?php

return [
    'connector' => 'Redis',
    'expire' => 180, // 任务过期时间,若要禁止则设置为null
    'default' => 'default', // 默认队列名称
    'host' => '127.0.0.1',
    'port' => '6379',
    'password' => '',
    'select' => 6, // redis db
    'timeout' => 0, // redis连接超时时间
    'persistent' => false, // 是否是长连接
];

创建任务。

在application/index/controller下,创建MyQueue.php控制器,代码如下:

<?php
namespace app\index\controller;

use think\Queue;

class MyQueue {

    public function index() {
    	// 任务类 - 执行时调用该类的deal方法
        $job_class = "app\index\job\Message@deal";
        // 队列名称
        $job_queue_name = 'Check';
        // 数据
        $job_data = array('timestamp' => time());
        // 把任务加入到消息队列,等待被执行

        // 延迟发送任务 5秒
        $is_push = Queue::later(5, $job_class, $job_data, $job_queue_name);

        // 立即发送任务
        // $is_push = Queue::push($job_class, $job_data, $job_queue_name);
        
        if($is_push !== false ){
            echo date('Y-m-d H:i:s') . " a new Hello Job is Pushed to the MQ"."<br>";
        }else{
            echo 'Oops, something went wrong.';
        }

        
    }

}

实现任务的具体内容,在application/index/job/创建Message.php,代码如下:

<?php
namespace app\index\job;

use think\queue\Job;

class Message {

    /* 处理逻辑 */
    public function deal(Job $job, $data) {
        // 这里实现逻辑

        // 任务执行成功 删除任务
        $job->delete();
    }

}

测试:

浏览器打开http://xxxx/index/MyQueue/index,添加任务完成

命令行进入到项目根目录,输入下面命令执行任务:

php think queue:work --queue Check

监听模式的启动方式可以实现定时器的效果,启动命令:

php think queue:listen --queue Check

listen的方式就是一直在监听,如果有动态加入的任务,会一直执行下去。

listen方式的后台启动命令:

php think queue:listen --queue CheckMessageStatus 1>/dev/null 2>&1 &

参考文档:https://github.com/coolseven/notes/blob/master/thinkphp-queue/README.md

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章