ThinkPHP 6.1 队列使用

在项目中通常有一些业务,需要执行的时间比较长并且不需要即时得到结果的业务,我们一般使用队列异步来执行。

安装

在tp中使用队列需要先安装think-queue

composer require topthink/think-queue

配置

安装完成后config中增加一个queue.php配置文件

配置如下:

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

下面我会通过两种用法,即同步和异步来介绍。

默认为 ’sync’ 同步执行

在实际业务队列开发时,可先使用同步方式来调试查看处理结果。

return [
    'default'     => 'sync',

改为 ’redis’ 后变为异步执行

使用redis配置时,需要首先配置好相应redis主机地址和端口号。

return [
    'default'     => 'redis',
    'connections' => [
        'redis'    => [
            'type'       => 'redis',
            'queue'      => 'default',
            'host'       => '127.0.0.1',
            'port'       => 6379,
            'password'   => '',
            'select'     => 0,     // 数据库为db 0
            'timeout'    => 0,     // 连接超时时间
            'persistent' => false, // 是否长连接
        ],
    ],

创建队列

app下创建queue目录,创建TestQueue队列处理类

内容如下:

<?php
/*
 * 测试队列处理任务
 */

namespace app\queue;

use think\queue\Job;

class TestQueue
{

    /**
     * fire方法是消息队列默认调用的方法
     * @param Job $job 当前的任务对象
     * @param array|mixed $data 发布任务时自定义的数据
     */
    public function fire(Job $job, $data)
    {
        // 执行任务
        $isJobDone = $this->doJob($data);

        if ($isJobDone) {
            // 任务执行成功 删除任务
            $job->delete();
        } else {
            if ($job->attempts() > 3) {
                // 任务重试3次后 删除任务
                $job->delete();
            }
        }
    }

    /**
     * 队列执行 业务处理
     * @param $data
     * @return bool
     */
    private function doJob($data)
    {
        switch ($data['type']){
            case 1:
                echo '类型1处理';
                dump($data);
                break;
            case 2:
                echo '类型2处理';
                dump($data);
                break;
        }
        return true;
    }
}

加入队列

创建一个控制器,来实现加入队列操作。

class Test extends Common
{
    public function __construct(App $app)
    {
        parent::__construct($app);
    }

    // 测试队列
    public function testQueue()
    {
        // 队列名称
        $queueName = 'test';

        // 队列的数据
        $data = [
            'id'      =>  1,
            'name'    =>  '张三',
            'gender'  =>  '男',
            'type'    =>  1
        ];

        // 队列处理类
        $queueClass = \app\queue\TestQueue::class;

        $res = Queue::push($queueClass, $data, $queueName);
        dump($res);
    }
}

同步可直接查看结果

异步(redis)执行

 

不再返回执行结果,返回的是随机唯一字符串;可通过监听队列查看执行结果。

启动方式

启动队列有两种方式。

1.work方式

work方式启动是单进程运行。

php think queue:work --queue test

// test为队列名称

通过命令窗口监听,然后请求加入队列,可看到命令行有相应执行。

命令行参数 

2.listen方式

这种方式是通过master主进程来监听,当请求进来后启动work子进程来运行上面的work方式启动。

php think queue:listen --queue test

也是通过命令窗口监听,然后请求加入队列,可看到命令行有相应执行。

命令行参数

 

更推荐listen方式来运行。这种方式更新代码后不需要手动重启。

延迟执行

其他都相同,只是使用later方法,并增加一个延迟时间参数。

// 测试队列
public function testQueue()
{
    // 队列名称
    $queueName = 'test';

    // 队列的数据
    $data = [
        'id'      =>  1,
        'name'    =>  '张三',
        'gender'  =>  '男',
        'type'    =>  1
    ];

    // 队列处理类
    $queueClass = \app\queue\TestQueue::class;

    // 延迟时间(秒)
    $delay = 10;

    $res = Queue::later($delay, $queueClass, $data, $queueName);
    print_r($res);die;
}

效果:

 

其他命令 

任务重启

php think queue:restart

清除所有失败任务

php think queue:flush

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值