thinkphp6+swoole使用rabbitMq队列

  1. 安装think-swoole

  2. 安装 composer require php-amqplib/php-amqplib,以支持rabbitMq使用

  3. 安装rabbitMq延迟队列插件
    1.

    复制代码
       安装 rabbitmq_delayed_message_exchange 插件,按照以下步骤操作:  
       下载插件:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases
    
       以下路由不一定是一样的!!!
       将插件复制到 RabbitMQ 插件目录: 将下载的插件文件复制到 RabbitMQ 插件目录。  
       sudo cp rabbitmq_delayed_message_exchange-3.8.9.ez /usr/lib/rabbitmq/lib/rabbitmq_server-<version>/plugins/
       将 <version> 替换为您的 RabbitMQ 服务器版本。  
       启用插件: 使用 RabbitMQ 命令行工具启用插件。  
       sudo rabbitmq-plugins enable rabbitmq_delayed_message_exchange
       重启 RabbitMQ: 重启 RabbitMQ 服务器以应用更改。  
       sudo systemctl restart rabbitmq-server
  4. config目录创建 rabbitmq.php 文件,内容如下

    return [
    'host' => '服务器地址',
    'port' => '端口',
    'user' => '账户',
    'password' => '密码',
    'vhost' => '/',
    'exchange' => 'delayed_exchange',
    'exchange_type' => 'direct', // 交换机类型(如 direct、fanout、topic)
    'exchange_arguments' => ['x-delayed-type' => 'direct'], // 延迟交换机参数
    ];

创建 RabbitMQService 类

复制代码
class RabbitMQService
{
    protected $connection;
    protected $channel;

    public function __construct()
    {
        $config = config('rabbitmq');
        $this->connection = new AMQPStreamConnection(
            $config['host'],
            $config['port'],
            $config['user'],
            $config['password'],
            $config['vhost']
        );
        $this->channel = $this->connection->channel();
        $this->channel->exchange_declare(
            $config['exchange'],
            'x-delayed-message', // 指定延迟交换机类型
            false,
            true,
            false,
            false,
            false,
            new AMQPTable(['x-delayed-type' => $config['exchange_type']]) // 设置延迟交换机的底层类型
        );
    }

    public function publish($message, $queue, $delay = 0)
    {
        // 声明队列
        $this->channel->queue_declare($queue, false, true, false, false);

        // 绑定队列到交换机
        $this->channel->queue_bind($queue, config('rabbitmq.exchange'));

        // 设置延迟头部信息
        $headers = new AMQPTable([
            'x-delay' => $delay // 延迟时间,单位为毫秒
        ]);

        // 创建消息
        $msg = new AMQPMessage($message, [
            'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT, // 持久化消息
        ]);
        $msg->set('application_headers', $headers); // 正确设置头信息

        // 发布消息到交换机
        $this->channel->basic_publish($msg, config('rabbitmq.exchange'));
    }


    public function consume($queue, $callback)
    {
        $this->channel->queue_declare($queue, false, true, false, false);
        $this->channel->basic_consume($queue, '', false, true, false, false, $callback);

        while ($this->channel->is_consuming()) {
            $this->channel->wait();
        }
    }

    public function __destruct()
    {
        $this->channel->close();
        $this->connection->close();
    }
}

创建 RabbitMqUseService 类文件

复制代码
class RabbitMqUseService
{
    // 消费队列
    public static function consumption()
    {
        $rabbitMQ = new RabbitMQService();
        $rabbitMQ->consume('queue', function ($msg){
            Log::error('消费队列'.$msg->body);
            $con = json_decode($msg->body,true);
            $class = $con['class'];
            Log::error("class->>".$class);
            if(class_exists($class)){
                $obj = new $class;
                $obj->handle($con['body']);
            }
        });
    }

    /**
     * @param $obj
     * @param $data
     * @param $delay
     * @return void
     */
    public static function push($obj,$data,$delay = 0)
    {
        $rabbitMQ = new RabbitMQService();
        $class = get_class($obj);
        // 构造消息体
        $message = json_encode([
            'class' => $class,  // 类名
            'body' => $data     // 具体数据
        ]);
        $rabbitMQ->publish($message, 'queue', $delay * 1000);
        var_dump('已加入');
    }

    public function test()
    {
        self::push(new TestJob(),['name'=>'test'],10);
    }
}

配置消费任务

复制代码
新建文件类 RabbitConsumptionHandle

class RabbitConsumptionHandle
{
    public function handle()
    {
        RabbitMqUseService::consumption();
    }
}

在app/event.php listen 中引入

  'listen'    => [
        'swoole.init' => [
            RabbitConsumptionHandle::class
        ]
   ]

新增队列

复制代码
      RabbitMqUseService::push(new \app\job\TestJob(),[
            'a'=>1,
            'b'=>2
        ]);
相关推荐
IT_陈寒几秒前
Java序列化坑了我三天,原来问题出在这个默认方法
前端·人工智能·后端
一条泥憨鱼3 分钟前
苍穹外卖【day10| 来电提醒和客户催单】
java·后端·websocket·苍穹外卖
ly768913 分钟前
Spring Boot 3.2 虚拟线程在 Web 层与 JDBC 池的实践边界
前端·spring boot·后端·tomcat·jdbc·虚拟线程
盖伦发发25 分钟前
SpringCloud Alibaba Sentinel 教学:限流、熔断、降级、线程/信号量隔离、活动过载保护
后端·软件工程
考虑考虑8 小时前
数据库中的EXISTS
运维·数据库·后端
郑州光合科技余经理9 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
毅炼9 小时前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
苏三说技术14 小时前
为什么越来越多人用OpenWiki?
后端
IT_陈寒14 小时前
Java里用Stream.parallel()翻车实录,这性能还不如单线程
前端·人工智能·后端
Bs_MoneyMagnet14 小时前
基于springboot+vue的生态果园采摘预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·计算机毕业设计