设为首页收藏本站
天天打卡

 找回密码
 立即注册
搜索
查看: 92|回复: 17

使用PHP和RabbitMQ实现消息队列功能

[复制链接]

1

主题

43

回帖

109

积分

注册会员

积分
109
发表于 2024-4-20 09:43:59 | 显示全部楼层 |阅读模式
目录


前言

今天我们来做个小试验,用PHP和RabbitMQ实现消息队列功能。
前期准备,需要安装好docker、docker-compose的运行环境。
使用docker部署php服务的详细步骤_docker_脚本之家 (jb51.net)

一、安装RabbitMQ

1、创建相关目录,执行如下命令。
  1. mkdir -p /docker/rabbitmq/data
  2. cd /docker/rabbitmq
复制代码
2、编写yaml文件,内容如下;version替换成自己的docker-compose版本。
  1. vim docker-compose.yaml
  2. version: '2.2.2'
  3. services:
  4.   rabbitmq:
  5.     image: rabbitmq
  6.     hostname: rabbitmq
  7.     container_name: rabbitmq
  8.     ports:
  9.       - "5672:5672"
  10.       - "15672:15672"
  11.     volumes:
  12.       - ./data:/var/lib/rabbitmq
  13.     networks:
  14.       - mynet

  15. networks:
  16.   mynet:
  17.     name: mynet
  18.     driver: bridge
复制代码
3、启动rabbitmq,执行如下命令。
  1. docker-compose up -d
复制代码
4、检查服务是否正常运行,执行如下命令。
  1. docker-compose ps -a
复制代码
返回如下内容,说明服务已正常启动,正在运行。

5、如果有服务启动失败,可以使用如下命令排查问题。
  1. docker logs rabbitmq
复制代码
6、至此,rabbitmq安全完成并且已正常运行。

二、安装PHP的AMQP扩展

1、进入test1项目容器,执行如下命令。
  1. docker exec -ti test1 /bin/sh
复制代码
2、下载AMQP扩展并且完成安装,执行如下命令。
  1. wget https://pecl.php.net/get/amqp-2.1.2.tgz
  2. tar -zxvf amqp-2.1.2.tgz
  3. cd amqp-2.1.2
  4. /usr/local/php/bin/phpize
  5. ./configure --with-php-config=/usr/local/php/bin/php-config
  6. make && make install
复制代码
3、修改php.ini配置,增加amqp扩展,内容如下。
  1. extension=amqp.so
复制代码
4、检查配置是否成功,执行如下命令,有返回说明已完成安装。
  1. /usr/local/php/bin/php -m|grep amqp
复制代码
5、重启PHP服务, 重启Web服务器或PHP-FPM服务以加载新安装的AMQP扩展。
6、至此,php的amqp扩展已完成安装。

三、测试验证

1、进入test1项目目录,执行如下命令。
  1. cd /docker/test1/html/
复制代码
2、编写生产者,代码内容如下。
  1. vim producer.php
  2. <?php
  3. // 创建连接到RabbitMQ服务器的连接
  4. $connection = new AMQPConnection(
  5.     [
  6.         'host' => 'rabbitmq',
  7.         'port' => 5672,
  8.         'username' => 'guest',
  9.         'password' => 'guest'
  10.     ]
  11. );
  12. $connection->connect();

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

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

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

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

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

  29. // 关闭连接
  30. $channel->close();
  31. $connection->disconnect();
复制代码
3、编写消费者,代码内容如下。
  1. vim consumer.php
  2. <?php
  3. // 创建连接到RabbitMQ服务器的连接
  4. $connection = new AMQPConnection(
  5.     [
  6.         'host' => 'rabbitmq',
  7.         'port' => 5672,
  8.         'username' => 'guest',
  9.         'password' => 'guest'
  10.     ]
  11. );
  12. $connection->connect();

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

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

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

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

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

  32. // 关闭连接
  33. $channel->close();
  34. $connection->disconnect();
复制代码
4、进入test1项目容器,监控消费者,执行如下命令。
  1. /usr/local/php/bin/php /usr/local/nginx/html/consumer.php
复制代码
5、在宿主机发起一个生产者请求,执行如下命令。
  1. 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、编写生产者、消费者进行验证。
上面的代码只是做个简单的示例,如果运用到实际的项目当中需要做配置化、封装。
以上就是使用PHP和RabbitMQ实现消息队列功能的详细内容,更多关于PHP RabbitMQ消息队列的资料请关注脚本之家其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

0

主题

55

回帖

111

积分

注册会员

积分
111
发表于 2024-5-1 12:49:56 | 显示全部楼层
能给个链接吗?我想深入了解一下。
  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:29
  • 最近打卡:2024-04-26 21:47:39

1

主题

63

回帖

178

积分

注册会员

积分
178
发表于 2024-6-28 22:14:35 | 显示全部楼层
顶一个,观点非常中肯!

0

主题

51

回帖

103

积分

注册会员

积分
103
发表于 2024-7-15 12:37:21 | 显示全部楼层
让我们一起努力
  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:3
  • 最近打卡:2024-04-30 20:51:41

0

主题

71

回帖

160

积分

注册会员

积分
160
发表于 2024-7-17 16:31:13 | 显示全部楼层
这个话题很有趣,我想多了解一些
  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:20
  • 最近打卡:2024-04-26 21:46:38

2

主题

39

回帖

142

积分

注册会员

积分
142
发表于 2024-7-20 01:28:59 | 显示全部楼层
同意你的观点,我们有共鸣。
  • 打卡等级:偶尔看看
  • 打卡总天数:13
  • 打卡月天数:0
  • 打卡总奖励:946
  • 最近打卡:2024-06-16 23:50:00

1

主题

216

回帖

2720

积分

金牌会员

积分
2720

活跃会员热心会员推广达人宣传达人灌水之王付费会员

发表于 2024-7-21 01:35:47 | 显示全部楼层
让我们一起努力

1

主题

47

回帖

117

积分

注册会员

积分
117
发表于 2024-7-28 12:21:35 | 显示全部楼层
我完全同意你的观点

0

主题

79

回帖

159

积分

注册会员

积分
159
发表于 2024-8-12 11:21:44 | 显示全部楼层
非常感谢你的观点,让我受益良多!

1

主题

50

回帖

121

积分

注册会员

积分
121
发表于 2024-8-22 01:02:17 | 显示全部楼层
牛逼
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|爱云论坛 - d.taiji888.cn - 技术学习 免费资源分享 ( 蜀ICP备2022010826号 )|天天打卡

GMT+8, 2024-11-24 12:06 , Processed in 0.105733 second(s), 28 queries .

Powered by i云网络 Licensed

© 2023-2028 正版授权

快速回复 返回顶部 返回列表