前言
今天我们来做个小试验,用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、编写生产者,代码内容如下。
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、编写消费者,代码内容如下。
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项目容器,监控消费者,执行如下命令。
/usr/local/php/bin/php /usr/local/nginx/html/consumer.php
5、在宿主机发起一个生产者请求,执行如下命令。
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、编写生产者、消费者进行验证。
上面的代码只是做个简单的示例,如果运用到实际的项目当中需要做配置化、封装。
最后因本人能力有限,有什么不对的地方望各位大佬指出好让我改进,多多包含,谢谢大家。