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

本文介绍了在ThinkPHP项目中如何安装和配置队列依赖,包括使用Composer安装think-queue,修改queue配置文件以连接Redis,创建Job目录和控制器逻辑,编写消费者类以及启动队列监听和工作进程。示例展示了如何在10秒后执行特定任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.安装队列依赖

如果是在Linux上,进入thinkphp项目的think文件所在目录,执行安装命令

composer require topthink/think-queue

2.修改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',
    ],
];

3.在项目下新建一个Job目录存放处理消息

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\SendCertJob.php

<?php

namespace app\job;

use think\queue\Job;

class SendCertJob
{
    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 进程允许执行的最长时间,以秒为单位

 执行命令开启队列

php think queue:work --queue sendCertQueue --daemon

开启的过程中遇到 不支持 --daemon 选项的可以进行后面的操作

修改think-queue下的Work.php文件51行,新增一下代码

->addOption('daemon', 'd', Option::VALUE_NONE, 'Run the queue server in daemon mode.')

 

think-queue是一个基于ThinkPHP5框架的消息队列扩展,可以将耗时的任务异步处理,提高系统的并发能力和稳定性。以下是think-queue的介绍和演示: 介绍: 1. think-queue的安装:可以通过composer安装,具体命令为:composer require topthink/think-queue。 2. think-queue的配置:需要在config/queue.php文件中进行配置,包括连接信息、队列名称、超时时间等。 3. think-queue的使用:可以通过php think queue:listen命令启动队列监听器,也可以通过php think queue:work命令启动队列处理器。 演示: 假设我们需要发送邮件,但是由于邮件发送需要连接SMTP服务器,因此会比较耗时。我们可以将邮件发送任务放入消息队列中异步处理,以提高系统的并发能力和稳定性。以下是一个简单的think-queue邮件发送示例: 1.定义邮件发送任务类: ```php namespace app\queue\job; use think\queue\Job; use PHPMailer\PHPMailer\PHPMailer; class SendMail { public function fire(Job $job, $data) { $mail = new PHPMailer(); // 邮件发送代码 if ($mail->send()) { // 邮件发送成功,删除任务 $job->delete(); } else { // 邮件发送失败,重新放入队列 $job->release(60); } } } ``` 2.将邮件发送任务加入消息队列: ```php use think\Queue; use app\queue\job\SendMail; // 将邮件发送任务加入消息队列 Queue::push(new SendMail($data)); ``` 3.启动队列监听器: ```shell php think queue:listen ``` 以上示例中,我们定义了一个SendMail类作为邮件发送任务,将其加入消息队列中异步处理。在fire方法中,我们使用PHPMailer类发送邮件,如果发送成功则删除任务,否则重新放入队列。最后,我们通过php think queue:listen命令启动队列监听器,等待任务的到来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值