首页 > 编程语言 >PHP使用RabbitMQ

PHP使用RabbitMQ

时间:2024-11-01 21:01:21浏览次数:2  
标签:插件 false rabbitmq queue connection RabbitMQ 使用 PHP channel

文档官网:https://www.rabbitmq.com/tutorials/tutorial-one-php

RabbitMQ关系说明:

交换机:一个交换机可以有多个路由(routeKey),一个路由(routeKey)可以绑定多个队列。在发布消息的时候指定交换机对应的路由(routeKey),即可对应到该路由(routeKey)对应的队列。

队列:常驻内存监听进行消费。

准备

  • 安装RabbitMq,指定数据卷
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 
 -v /data/server/rabbitmq/data:/var/lib/rabbitmq rabbitmq:3.13-management-alpine
  • 安装延迟插件

延迟插件地址: https://github.com/rabbitmq/rabbitmq-delayed-message-exchange?tab=readme-ov-file

1.下载.ez文件到映射目录
rabbitmq_delayed_message_exchange-3.13.0.ez
2.找到插件目录,将插件复制到该目录
执行获取插件目录位置命令
d88ef1c2d3aa:/# rabbitmq-plugins directories -s
插件目录:
Plugin archives directory: /opt/rabbitmq/plugins
Plugin expansion directory: /var/lib/rabbitmq/mnesia/rabbit@d88ef1c2d3aa-plugins-expand
Enabled plugins file: /etc/rabbitmq/enabled_plugins
3.将.ez文件放入插件目录
mv /var/lib/rabbitmq/rabbitmq_delayed_message_exchange-3.13.0.ez /opt/rabbitmq/plugins/
4.启用插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange

管理界面

  • 登录地址:ip:15672
  • 账号密码:guest

查看交换机类型中是否有延迟消息类型
rabbitMQ管理截图.png

使用

  • 创建获取连接工具类
<?php

namespace app\extend;

use think\Exception;
use PhpAmqpLib\Connection\AMQPStreamConnection;

// RabbitMq工具类
class RabbitMqUtil
{
    // 连接
    private static $connection = null;
    /**
     * 获取连接
     *
     * @throws Exception
     */
    public static function getConnection(): ?AMQPStreamConnection
    {
        if (self::$connection) {
            return self::$connection;
        }
        try {
            self::$connection = new AMQPStreamConnection('172.17.0.2', 5672, 'guest', 'guest');
        } catch (\Exception $e) {
            throw new Exception($e->getMessage());
        }

        return self::$connection;
    }

    // 关闭连接
    public static function closeConnection()
    {
        if (self::$connection) {
            self::$connection->close();
        }
    }
}
  • 生产者
use app\extend\RabbitMqUtil;
use PhpAmqpLib\Wire\AMQPTable;
use PhpAmqpLib\Message\AMQPMessage;

// 发送消息
public function sendMsg()
    {
         // 发消息
        try {
            // 获取连接
            $connection = RabbitMqUtil::getConnection();
            // 获取管道
            $channel = $connection->channel();
            // 延迟交换机名
            $exchangeName = 'MyDelayedChange';
            // 延迟交换机参数
            $arguments = new AMQPTable([
                                           // 内部使用的交换机类型 direct
                                           'x-delayed-type' => 'direct',
                                       ]);
            // 创建延迟交换机
            $channel->exchange_declare($exchangeName, 'x-delayed-message', false, true, false, false, false, $arguments);
            // 队列名
            $queue = 'order_queue';
            // 创建队列,幂等性,多次声明不会重复创建
            $channel->queue_declare($queue, false, true, false, false);
            // routeKey
            $routeKey = 'order_queue';
            // 绑定队列到交换机
            $channel->queue_bind($queue, $exchangeName, $routeKey);
            // 发送的消息
            $messageBody = 'this is order';
            $msg         = new AMQPMessage($messageBody, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
            // 设置5秒延迟
            $headers = new AMQPTable(['x-delay' => 5000]);
            // 设置消息头
            $msg->set("application_headers", $headers);
            // 发布消息
            $channel->basic_publish($msg, $exchangeName, $routeKey);
            // 关闭连接
            $channel->close();
            $connection->close();
        } catch (\Exception $e) {
        }
        echo "发送OK";
    }
  • 消费
use think\Exception;
use app\extend\RabbitMqUtil;

// 接收消息
protected function execute()
    {
        $connection = null;
        $channel    = null;
        try {
            $connection = RabbitMqUtil::getConnection();
            $channel    = $connection->channel();
            // 声明一个队列 幂等性,不会重复创建
            $queue = 'order_queue';
            $channel->queue_declare($queue, false, true, false, false);
            $callback = function($msg) {
                echo '订单数据';
                echo $msg->getBody(), "\n";
                // 消费完成ack
                $msg->ack();
            };
            // 调度 不能都给你一个消费者
            $channel->basic_qos(0, 1, false);
            $channel->basic_consume($queue, '', false, false, false, false, $callback);
            try {
                $channel->consume();
            } catch (\Throwable $exception) {
                echo $exception->getMessage();
            }
        } catch (Exception $e) {
            dump('连接异常');
            dump($e->getMessage());
        }
        $channel->close();
        $connection->close();
    }

标签:插件,false,rabbitmq,queue,connection,RabbitMQ,使用,PHP,channel
From: https://www.cnblogs.com/zhuo512/p/18521253

相关文章

  • 电路板和芯片的使用有什么区别
    电路板和芯片在电子设备中扮演着关键角色,它们是现代电子技术不可或缺的组成部分。尽管二者在电子系统中常常共同工作,但它们的功能、设计原理、应用场景和技术要求有着本质的区别。本文旨在探讨电路板和芯片在使用上的主要区别,包括:1.基本功能和构造差异;2.设计和制造过程;3.应用领域......
  • 【Java Web】使用JDBC操作数据库(含代码示例)
    文章目录JDBC主要组成部分访问数据库步骤数据库交互StatementPreparedStatementSQL注入攻击演示示例单查询多查询返回记录数JDBC(JavaDatabaseConnectivity)是Java中用于执行SQL语句的标准API,它提供了一种统一的方式来访问各种关系型数据库。JDBC使得开发者能够以......
  • 熟练掌握并使用Java的NIO操作
    Java的NewInput/Output(NIO)库是一种非阻塞I/O操作的集合,旨在提高I/O操作的效率。相比于传统的JavaI/O(基于java.io包),NIO提供了更灵活、更强大的I/O处理能力。以下是一篇详细的文章,帮助你彻底熟练掌握并使用Java的NIO操作。一、JavaNIO概述JavaNIO(NewI/O)主要包含以下几个核......
  • 如何使用Socket.io
    为了实现实时通讯,Socket.io是一个广受欢迎的JavaScript库。以下步骤将指导您如何使用Socket.io:1.安装并设置;2.创建服务器端连接;3.创建客户端连接;4.发送和接收消息;5.了解事件和消息的处理。首先,您需要在项目中安装Socket.io。1.安装并设置Socket.io可以很容易地通过npm或yarn进......
  • Go语言的动态链接库(DLL)创建和使用
    #Go语言的动态链接库(DLL)创建和使用在讨论Go语言的动态链接库(DLL)创建和使用时,核心要点包括:创建DLL的步骤、调用DLL中的函数、跨平台兼容性问题、性能优化策略。创建DLL的步骤是理解和实践Go语言动态链接库的基础,涉及编写DLL源代码、编译为DLL文件以及确保DLL在目标系统上可用。......
  • 如何使用7种方法将PDF转换为图像
    PDF是共享文件的首选格式。但是,在某些情况下,您可能需要将PDF转换为图像。比如,当您计划发送的PDF文档太大而无法在线上传,或者您计划在将文档用于演示之前向其添加视觉元素时,这种情况就会出现。如果您是第一次计划将PDF转换为图像,您可能不知道最好使用哪些工具。因此,为了帮助您......
  • vue3项目中使用iconify
    事情是这样的,我比较喜欢使用MaterialDesignIcons的图标(MaterialDesignIcons-IconLibrary-Pictogrammers)。最初我把整个MaterialDesignIcons的css文件下载下来,然后在vue3项目中使用。但是这个css文件的体积比较大,但是我用的也就是那几个icon图标。有没有办法实现图......
  • 【正点原子K210连载】第四十九章 综合例程摘自【正点原子】DNK210使用指南-CanMV版指
    第四十九章综合例程本章,简单介绍一下DNK210开发板的CanMV综合例程。本章分为如下几个小节:49.1综合例程运行说明49.2综合例程展示49.1综合例程运行说明本综合例程旨在演示利用CanMV在DNK210开发板上实现的各种功能,包括板载LED控制、板载蜂鸣器控制、相机、相册、音乐播放器、......
  • Windows部署rabbitmq
    本次安装环境:系统:Windows11软件建议版本:erlangOPT26.0.2rabbitmq3.12.4一、下载1.1下载erlang官网下载地址:1.2下载rabbitmq官网下载地址:建议使用解压版,安装版可能会在安装软件时出现查不到erlang环境的报错,导致安装失败。二、部署2.1部署erlang2.1.1安装http复制代码右键管......
  • 使用wxpython开发跨平台桌面应用,实现程序托盘图标和界面最小化及恢复处理
    在前面随笔《基于wxpython的跨平台桌面应用系统开发》介绍了一些关于wxpython开发跨平台桌面应用的总体效果,开发桌面应用,会有很多界面细节需要逐一处理,本篇随笔继续深入该主题,对开发跨平台桌面应用的一些实现细节继续深入研究并总结,介绍程序托盘图标和界面最小化及恢复处理。1、......