thinkphp6 消息队列think-queue(完整版)

1.安装队列依赖

composer require topthink/think-queue

2.配置文件/config/queue.php


return [
    'default'     => 'redis',
    'connections' => [
        'sync'     => [
            'type' => 'sync',
        ],
        'database' => [
            'type'  => 'database',
            'queue' => 'default',
            'table' => 'jobs',
        ],
        'redis'    => [
            'type'       => 'redis',
            'queue'      => 'default',
            'host'       => '127.0.0.1',
            'port'       => 6379,
            'password'   => '',
            'select'     => 0,
            'timeout'    => 0,
            'persistent' => false,
        ],
    ],
    'failed'      => [
        'type'  => 'none',
        'table' => 'failed_jobs',
    ],
];

3.在项目下新建一个Job目录存放处理消息
thinkphp6 消息队列think-queue(完整版)_第1张图片
4.控制器编写逻辑代码 app/controller/index.php

use think\facade\Queue;

    public function job(Request $request)
    {
        $params = $request->get();
        $jobHandlerClassName = 'app\job\Task'; 
        $jobQueueName = 'task';
        $orderData = ['order_sn'=>$params['id']];
        //Queue::later();//立即执行
        $isPushed = Queue::later(10, $jobHandlerClassName, $orderData, $jobQueueName); //这儿的10是指10秒后执行队列任务
        
        if($isPushed !== false){
            echo '队列添加成功';
        }else{
            echo '插入失败了';
        }
    }

5.编写对应的消费者类 app\job/task.php



namespace app\job;

use think\queue\Job;

class Task
{
    public function fire(Job $job, $data)
    {
        $rt = $this->doJob($data);
        if($rt){
            $job->delete();
            return true;
        }

        // 重试三次失败 todo...
        if($job->attempts() == 3){
            $job->delete();
            return false;
        }

        //执行失败10S后重试
        $job->release(10);


    }

    public function doJob($data)
    {
        echo date('Y-m-d H:i:s')."\n";
        return false;
    }


}

php think queue:listen
–queue helloJobQueue \ //监听的队列的名称
–delay 0 \ //如果本次任务执行抛出异常且任务未被删除时,设置其下次执行前延迟多少秒,默认为0
–memory 128 \ //该进程允许使用的内存上限,以 M 为单位
–sleep 3 \ //如果队列中无任务,则多长时间后重新检查
–tries 0 \ //如果任务已经超过重发次数上限,则进入失败处理逻辑,默认为0
–timeout 60 // work 进程允许执行的最长时间,以秒为单位

thinkphp6 消息队列think-queue(完整版)_第2张图片
6.安装守护进程(Supervisor)
thinkphp6 消息队列think-queue(完整版)_第3张图片

你可能感兴趣的:(thinkphp6,php,redis)