thinkphp6使用queue扩展

本文介绍了如何在ThinkPHP6框架中安装并配置`topthink/think-queue`扩展来实现消息队列,重点讲解了数据库驱动的设置、创建数据库表以及队列任务的创建和执行。此外,还展示了如何向队列推送消息以及在命令行中监听和处理队列任务。

queue扩展地址:

topthink/think-queue - PackagistThe ThinkPHP6 Queue Packagehttps://packagist.org/packages/topthink/think-queue使用composer 拉取扩展包

composer require topthink/think-queue

拉取扩展之后在config文件夹中找到queue.php配置驱动,这是演示数据库驱动,可根据项目选择合适的驱动。

在tp\vendor\topthink\think-queue\src\queue\connector\Database.php可查看要创建的数据表

创建数据库

CREATE TABLE `jobs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `queue` varchar(255) NOT NULL,
  `payload` longtext NOT NULL,
  `attempts` tinyint(3) unsigned NOT NULL,
  `reserved` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `reserve_time` int(10) unsigned DEFAULT NULL,
  `available_time` int(10) unsigned NOT NULL,
  `create_time` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

一、创建执行任务方法

在tp\app文件下创建job文件夹,新建队列执行文件例如:job1.php

<?php
namespace app\job;
use think\queue\Job;
use think\facade\Log;
class Job1
{
    public function fire(Job $job, $data)
    {
         //....这里执行具体的任务 
        
         if ($job->attempts() > 3) {
            //通过这个方法可以检查这个任务已经重试了几次了
            Log::record('执行失败', 'notice');
       }else{
        try {
            //执行相对应的任务
            $this->Add($data);
        } catch (\Exception $ex) {
            Log::record('执行错误', 'notice');
        }
       }
      
      
      //如果任务执行成功后 记得删除任务,不然这个任务会重复执行,直到达到最大重试次数后失败后,执行failed方法
      $job->delete();
      Log::record('删除任务', 'notice');
      // 也可以重新发布这个任务
    //   $job->release($delay); //$delay为延迟时间
    }

    public function failed($data){
        Log::record('队列失败了', 'notice');
        // ...任务达到最大重试次数后,失败了
    }

    public function Add($data)
    {
        // 执行任务
        Log::record('执行相对应的任务', 'notice');
    }
}

 二、向执行任务方法推送消息(传递参数)。

  在控制器或者命令行,向queue推送消息,

命令行:命令行 · ThinkPHP6.0完全开发手册 · 看云ThinkPHP`6.0`基于精简核心和统一用法两大原则在`5.1`的基础上对底层架构做了进一步的优化改进,并更加规范化。 https://www.kancloud.cn/manual/thinkphp6_0/1037640

例如在控制器中:

<?php
namespace app\controller;
use think\facade\Log;
use think\facade\Queue;
use app\BaseController;

class Index extends BaseController
{
    public function index()
    {
        echo phpinfo();
    }
    /**
     * @param $job   执行的队列方法
     * @param $data  传递的数据参数
     * @param $queue 队列的名称,默认:default
     */
    public function hello()
    {
        $job = "app\job\job1";
        Queue::push($job, $data = '123455', $queue = null);
    }
}

执行控制器方法,数据库中会记录一条消息。

 然后在命令行中执行:


php think queue:listen

php think queue:work

php think queue:listen --queue=default

php think queue:work --queue=default

php think queue:listen --queue=(数据库中queue的名称)

执行后,会一直监听消息队列,只有有新的队列,就会执行队列。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值