如何使用PHP和RabbitMQ实现消息队列?

前言

今天我们来做个小试验,用PHP和RabbitMQ实现消息队列功能。

前期准备,需要安装好docker、docker-compose的运行环境。

如何使用docker部署php服务_php如何使用docker发布-CSDN博客

一、安装RabbitMQ

1、创建相关目录,执行如下命令。

mkdir -p /docker/rabbitmq/data
cd /docker/rabbitmq

2、编写yaml文件,内容如下;version替换成自己的docker-compose版本。

vim docker-compose.yaml
version: '2.2.2'
services:
  rabbitmq:
    image: rabbitmq
    hostname: rabbitmq
    container_name: rabbitmq
    ports:
      - "5672:5672"
      - "15672:15672"
    volumes:
      - ./data:/var/lib/rabbitmq
    networks:
      - mynet

networks:
  mynet:
    name: mynet
    driver: bridge

3、启动rabbitmq,执行如下命令。

docker-compose up -d

4、检查服务是否正常运行,执行如下命令。

docker-compose ps -a

返回如下内容,说明服务已正常启动,正在运行。

5、如果有服务启动失败,可以使用如下命令排查问题。

docker logs rabbitmq

6、至此,rabbitmq安全完成并且已正常运行。

二、安装PHP的AMQP扩展

1、进入test1项目容器,执行如下命令。

docker exec -ti test1 /bin/sh

2、下载AMQP扩展并且完成安装,执行如下命令。

wget https://pecl.php.net/get/amqp-2.1.2.tgz
tar -zxvf amqp-2.1.2.tgz
cd amqp-2.1.2
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

3、修改php.ini配置,增加amqp扩展,内容如下。

extension=amqp.so

4、检查配置是否成功,执行如下命令,有返回说明已完成安装。

/usr/local/php/bin/php -m|grep amqp

5、重启PHP服务, 重启Web服务器或PHP-FPM服务以加载新安装的AMQP扩展。

6、至此,php的amqp扩展已完成安装。

三、测试验证

1、进入test1项目目录,执行如下命令。

cd /docker/test1/html/

2、编写生产者,代码内容如下。

php 复制代码
vim producer.php
<?php
// 创建连接到RabbitMQ服务器的连接
$connection = new AMQPConnection(
    [
        'host' => 'rabbitmq',
        'port' => 5672,
        'username' => 'guest',
        'password' => 'guest'
    ]
);
$connection->connect();

// 创建一个频道(channel)
$channel = new AMQPChannel($connection);

// 声明一个交换机(exchange)
$exchange = new AMQPExchange($channel);
$exchange->setName('exchange_name');
$exchange->setType(AMQP_EX_TYPE_DIRECT); // 直接交换机类型
$exchange->declareExchange();

// 声明一个队列
$queue = new AMQPQueue($channel);
$queue->setName('queue_name');
$queue->declareQueue();

// 绑定交换机到队列
$queue->bind('exchange_name', 'routing_key');

// 发送一条消息
$messageBody = 'Hello, RabbitMQ!'.(!empty($_GET['msg']) ? $_GET['msg'] : '');
$exchange->publish($messageBody, 'routing_key');

// 关闭连接
$channel->close();
$connection->disconnect();

3、编写消费者,代码内容如下。

php 复制代码
vim consumer.php
<?php
// 创建连接到RabbitMQ服务器的连接
$connection = new AMQPConnection(
    [
        'host' => 'rabbitmq',
        'port' => 5672,
        'username' => 'guest',
        'password' => 'guest'
    ]
);
$connection->connect();

// 创建一个频道(channel)
$channel = new AMQPChannel($connection);

// 声明一个交换机(exchange)
$exchange = new AMQPExchange($channel);
$exchange->setName('exchange_name');
$exchange->setType(AMQP_EX_TYPE_DIRECT); // 直接交换机类型
$exchange->declareExchange();

// 声明一个队列
$queue = new AMQPQueue($channel);
$queue->setName('queue_name');
$queue->declareQueue();

// 绑定交换机到队列
$queue->bind('exchange_name', 'routing_key');

// 开始消费消息
$queue->consume(function (AMQPEnvelope $envelope, AMQPQueue $queue) {
    if ($envelope->getBody()) {
        echo "Received message: ", $envelope->getBody(), "\n";
    }
}, AMQP_AUTOACK); // 如果设置为AMQP_AUTOACK,消息一旦收到就被认为已确认,否则需要手动确认

// 关闭连接
$channel->close();
$connection->disconnect();

4、进入test1项目容器,监控消费者,执行如下命令。

php 复制代码
/usr/local/php/bin/php /usr/local/nginx/html/consumer.php

5、在宿主机发起一个生产者请求,执行如下命令。

php 复制代码
curl "http://127.0.0.1:8081/producer.php?msg=max"

6、正常情况下,会在test1项目容器看到消费者的输出,类似如下截图。

7、至此,php和rabbitmq实现消息队列的功能已测试验证OK。

总结

用PHP和RabbitMQ实现消息队列功能,其实也不复杂,主要有以下几个步骤。

1、安装RabbitMQ。

2、安装PHP的AMQP扩展。

3、编写生产者、消费者进行验证。

上面的代码只是做个简单的示例,如果运用到实际的项目当中需要做配置化、封装。

最后因本人能力有限,有什么不对的地方望各位大佬指出好让我改进,多多包含,谢谢大家。

相关推荐
想学习java初学者35 分钟前
Docker compose部署elasticsearch(单机版)
运维·docker·容器
微刻时光2 小时前
Docker部署Nginx
运维·nginx·docker·容器·经验
CodingBrother2 小时前
Kafka 与 RabbitMQ 的联系
分布式·kafka·rabbitmq
陈小肚3 小时前
k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储
docker·容器·kubernetes
A陈雷3 小时前
springboot整合elasticsearch,并使用docker desktop运行elasticsearch镜像容器遇到的问题。
spring boot·elasticsearch·docker
.生产的驴3 小时前
SpringCloud Gateway网关路由配置 接口统一 登录验证 权限校验 路由属性
java·spring boot·后端·spring·spring cloud·gateway·rabbitmq
小扳3 小时前
Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
运维·spring boot·后端·mysql·spring cloud·docker·容器
JDS_DIJ3 小时前
RabbitMQ
java·rabbitmq·java-rabbitmq
网安_秋刀鱼5 小时前
PHP代码审计 - SQL注入
sql·web安全·网络安全·php·1024程序员节
B20080116刘实5 小时前
CTF攻防世界小白刷题自学笔记13
开发语言·笔记·web安全·网络安全·php