think-queue 消息队列

chenvle 2022-11-04 PM 743℃ 0条
  • 安装think-queue 组件
composer require topthink/think-queue
  • 配置文件/config/queue.php
<?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',
    ],
];
  • 创建消费者类
  • 编辑消费者类
<?php
namespace app\admin\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)
    {
        //执行任务
        return true;
    }


}
  • 控制器编写逻辑代码
public function redis()
    {
        $jobHandlerClassName = 'app\admin\job\Task';
        $jobQueueName = 'task';
        $orderData = ['order_sn'=>time()];
        //Queue::push();//立即执行

        //这儿的10是指10秒后执行队列任务
        $isPushed = Queue::later('10', $jobHandlerClassName, $orderData, $jobQueueName); 


        if($isPushed !== false){
            echo '队列添加成功';
        }else{
            echo '插入失败了';
        }

    }
  • 在服务器的项目目录运行队列监听
php think queue:listen --queue task
或
php think queue:work --queue task
  • 拓展:Supervisor安装
  • 备注
$isPushed = Queue::later('10', $jobHandlerClassName, $orderData, $jobQueueName); 中如果$jobQueueName 不传参数,则队列监听可不指定队列任务(php think queue:listen),如传了则必须要指定任务才会执行!!!#避坑

非特殊说明,本博所有文章均为博主原创。

评论啦~