ThinkPHP使用think-queue消息队列

安装与配置:

  1. 是用Composer进行安装,命令:composer require topthink/think-queue(版本加上=2.0.*)
  2. 配置文件位于 application/extra/queue.php(本文使用类型是Redis)
  3. 配置文件 application/extra/queue.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, // 是否是长连接
];

4.新建 application/index/controller/MyQueue.php

namespace app\index\controller;
use think\Controller;
use think\Queue;
class MyQueue extends Controller
{
    public function index($job_data, $type = 'push')	//jio_data 需要发送的数据
    {
        $job_class = "app\index\job\Message@deal";  // 任务类 - 执行时调用该类的deal方法
        $job_queue_name = 'Check';// 队列名称
        switch ($type) {
            case 'later':
                $is_push = Queue::later(5, $job_class, $job_data, $job_queue_name); // 延迟发送任务 5秒
                break;
            case 'push':
                $is_push = Queue::push($job_class, $job_data, $job_queue_name);   // 立即发送任务
                break;
        }
        if ($is_push !== false) {
            echo date('Y-m-d H:i:s') . " 新增任务" . "
"
; } else { echo '新增任务错误'; } } }

5.新建application/index/job/Message.php(对应调用方法)

namespace app\index\job;
use app\index\model\newsinfo;
use think\queue\Job;

class Message
{
    /* 处理逻辑 */
    public function deal(Job $job, $data)
    {
        //任务执行超过1次,则删除任务
        $nums=$job->attempts();
        if ($nums >0) {
            $job->delete();
        }
         $job->delete();
    }
}
//每次执行完Job之后需要delete掉,不然他会在里面反复执行
//$job->attempts()只是去获取队列给返回的data这条数据的执行次数,延时队列没有到时候是不会去执行deal这个函数的,进入就说明要执行这条数据了,attempts的次数只会在你执行失败,或者执行完了没有delete才会+1
//push是正常队列 later是延时队列 执行流程可以通过Log::write()用日志查看

你可能感兴趣的:(ThinkPHP)