当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布: 来源: PHP粉丝网  添加日期:2024-04-28 15:39:24 浏览: 评论:0 

这篇文章主要介绍了如何使用PHP和RabbitMQ实现消息队列功能,文中通过示例代码介绍的非常详细,对大家学习或者使用PHP具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。

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

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

一、安装RabbitMQ

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

mkdir -p /docker/rabbitmq/data

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.    
  16. networks: 
  17.   mynet: 
  18.     name: mynet 
  19.     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扩展并且完成安装,执行如下命令。

  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扩展,内容如下。

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、编写生产者,代码内容如下。

  1. vim producer.php 
  2. // 创建连接到RabbitMQ服务器的连接 
  3. $connection = new AMQPConnection( 
  4.     [ 
  5.         'host' => 'rabbitmq'
  6.         'port' => 5672, 
  7.         'username' => 'guest'
  8.         'password' => 'guest' 
  9.     ] 
  10. ); 
  11. $connection->connect(); 
  12.    
  13. // 创建一个频道(channel) 
  14. $channel = new AMQPChannel($connection); 
  15.    
  16. // 声明一个交换机(exchange) 
  17. $exchange = new AMQPExchange($channel); 
  18. $exchange->setName('exchange_name'); 
  19. $exchange->setType(AMQP_EX_TYPE_DIRECT); // 直接交换机类型 
  20. $exchange->declareExchange(); 
  21.    
  22. // 声明一个队列 
  23. $queue = new AMQPQueue($channel); 
  24. $queue->setName('queue_name'); 
  25. $queue->declareQueue(); 
  26.    
  27. // 绑定交换机到队列 
  28. $queue->bind('exchange_name''routing_key'); 
  29.    
  30. // 发送一条消息 
  31. $messageBody = 'Hello, RabbitMQ!'.(!emptyempty($_GET['msg']) ? $_GET['msg'] : ''); 
  32. $exchange->publish($messageBody'routing_key'); 
  33.    
  34. // 关闭连接 
  35. $channel->close(); 
  36. $connection->disconnect(); 

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

  1. vim consumer.php 
  2. // 创建连接到RabbitMQ服务器的连接 
  3. $connection = new AMQPConnection( 
  4.     [ 
  5.         'host' => 'rabbitmq'
  6.         'port' => 5672, 
  7.         'username' => 'guest'
  8.         'password' => 'guest' 
  9.     ] 
  10. ); 
  11. $connection->connect(); 
  12.    
  13. // 创建一个频道(channel) 
  14. $channel = new AMQPChannel($connection); 
  15.    
  16. // 声明一个交换机(exchange) 
  17. $exchange = new AMQPExchange($channel); 
  18. $exchange->setName('exchange_name'); 
  19. $exchange->setType(AMQP_EX_TYPE_DIRECT); // 直接交换机类型 
  20. $exchange->declareExchange(); 
  21.    
  22. // 声明一个队列 
  23. $queue = new AMQPQueue($channel); 
  24. $queue->setName('queue_name'); 
  25. $queue->declareQueue(); 
  26.    
  27. // 绑定交换机到队列 
  28. $queue->bind('exchange_name''routing_key'); 
  29.    
  30. // 开始消费消息 
  31. $queue->consume(function (AMQPEnvelope $envelope, AMQPQueue $queue) { 
  32.     if ($envelope->getBody()) { 
  33.         echo "Received message: "$envelope->getBody(), "\n"
  34.     } 
  35. }, AMQP_AUTOACK); // 如果设置为AMQP_AUTOACK,消息一旦收到就被认为已确认,否则需要手动确认 
  36.    
  37. // 关闭连接 
  38. $channel->close(); 
  39. $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项目容器看到消费者的输出,类似如下截图。

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

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

总结

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

1、安装RabbitMQ。

2、安装PHP的AMQP扩展。

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

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

Tags: RabbitMQ PHP消息队列

分享到: