前言
今天我们来做个小试验,用PHP和RabbitMQ实现消息队列功能。
前期准备,需要安装好docker、docker-compose的运行环境。
使用docker部署php服务的详细步骤_docker_IT俱乐部 (jb51.net)
一、安装RabbitMQ
1、创建相关目录,执行如下命令。
1 2 | mkdir -p /docker/rabbitmq/data cd /docker/rabbitmq |
2、编写yaml文件,内容如下;version替换成自己的docker-compose版本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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,执行如下命令。
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 2 3 4 5 6 | 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扩展,内容如下。
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | vim producer.php '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、编写消费者,代码内容如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | vim consumer.php '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项目容器,监控消费者,执行如下命令。
1 | /usr/local/php/bin/php /usr/local/nginx/html/consumer .php |
5、在宿主机发起一个生产者请求,执行如下命令。
6、正常情况下,会在test1项目容器看到消费者的输出,类似如下截图。
7、至此,php和rabbitmq实现消息队列的功能已测试验证OK。
总结
用PHP和RabbitMQ实现消息队列功能,其实也不复杂,主要有以下几个步骤。
1、安装RabbitMQ。
2、安装PHP的AMQP扩展。
3、编写生产者、消费者进行验证。
上面的代码只是做个简单的示例,如果运用到实际的项目当中需要做配置化、封装。
以上就是使用PHP和RabbitMQ实现消息队列功能的详细内容,更多关于PHP RabbitMQ消息队列的资料请关注IT俱乐部其它相关文章!