文档章节

用 PHP 收发 RabbitMQ 消息

mac_zhao
 mac_zhao
发布于 2014/09/26 17:41
字数 521
阅读 18
收藏 0

AMQP

扩展的安装参照《给

PHP

安装

amqp

扩展》

 

 

消费者:接收消息

 

逻辑:

创建连接

-->

创建

channel-->

创建交换机

-->

创建队列

-->

绑定交换机

/

队列

/

路由键

-->

接收

消息

 

<?php    

/************************************* 

 * PHP amqp(RabbitMQ) Demo - consumer 

 * Author: Linvo 

 * Date: 2012/7/30 

 *************************************/  

//

配置信息

  

$conn_args = array(  

    

'host' => '192.168.1.93',   

    

'port' => '5672',   

    

'login' => 'guest',   

    

'password' => 'guest',  

    

'vhost'=>'/'  

);    

$e_name = 'e_linvo'; //

交换机名

  

$q_name = 'q_linvo'; //

队列名

  

$k_route = 'key_1'; //

路由

key  

  

//

创建连接和

channel  

$conn = new AMQPConnection($conn_args);    

if (!$conn->connect()) {    

    

die("Cannot connect to the broker!\n");    

}    

$channel = new AMQPChannel($conn);    

  

//

创建交换机

     

$ex = new AMQPExchange($channel);    

$ex->setName($e_name);  

$ex->setType(AMQP_EX_TYPE_DIRECT); //direct

类型

   

$ex->setFlags(AMQP_DURABLE); //

持久化

  

echo "Exchange Status:".$ex->declare()."\n";    

    

//

创建队列

     

$q = new AMQPQueue($channel);  

$q->setName($q_name);    

$q->setFlags(AMQP_DURABLE); //

持久化

   

echo "Message Total:".$q->declare()."\n";    

  

//

绑定交换机与队列,并指定路由键

  

echo 'Queue Bind: '.$q->bind($e_name, $k_route)."\n";  

  

//

阻塞模式接收消息

  

echo "Message:\n";    

while(True){  

    

$q->consume('processMessage');    

    

//$q->consume('processMessage', AMQP_AUTOACK); //

自动

ACK

应答

   

}  

$conn->disconnect();    

  

/** 

 * 

消费回调函数

 

 * 

处理消息

 

 */  

function processMessage($envelope, $queue) {  

    

$msg = $envelope->getBody();  

    

echo $msg."\n"; //

处理消息

  

    

$queue->ack($envelope->getDeliveryTag()); //

手动发送

ACK

应答

  

}  

 

生产者:发送消息

 

逻辑:创建连接

-->

创建

channel-->

创建交换机对象

-->

发送消息

 

<?php    

/************************************* 

 * PHP amqp(RabbitMQ) Demo - publisher 

 * Author: Linvo 

 * Date: 2012/7/30 

 *************************************/  

//

配置信息

  

$conn_args = array(  

    

'host' => '192.168.1.93',   

    

'port' => '5672',   

    

'login' => 'guest',   

    

'password' => 'guest',  

    

'vhost'=>'/'  

);    

$e_name = 'e_linvo'; //

交换机名

  

//$q_name = 'q_linvo'; //

无需队列名

  

$k_route = 'key_1'; //

路由

key  

  

//

创建连接和

channel  

$conn = new AMQPConnection($conn_args);    

if (!$conn->connect()) {    

    

die("Cannot connect to the broker!\n");    

}    

$channel = new AMQPChannel($conn);    

  

//

消息内容

  

$message = "TEST MESSAGE! 

测试消息!

";    

  

//

创建交换机对象

     

$ex = new AMQPExchange($channel);    

$ex->setName($e_name);    

  

//

发送消息

  

//$channel->startTransaction(); //

开始事务

   

for($i=0; $i<5; ++$i){  

    

echo "Send Message:".$ex->publish($message, $k_route)."\n";   

}  

//$channel->commitTransaction(); //

提交事务

  

  

$conn->disconnect();    

 

需要注意的地方是:

 

queue

对象有两个方法可用于取消息:

consume

get

 

前者是阻塞的,无消息时会被挂起,适合循环中使用;

 

后者则是非阻塞的,取消息时有则取,无则返回

false

 

 

测试截图:

 

运行消费者,收消息:

 

 

 

运行生产者,发消息:

 

 

消费者接收到消息:

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
mac_zhao
粉丝 41
博文 249
码字总数 304671
作品 0
普陀
程序员
消息中间件—RabbitMQ(集群监控篇1)

摘要:任何没有监控的系统上线,一旦在生产环境发生故障,那么排查和修复问题的及时性将无法得到保证 一、为何要对消息中间件进行监控? 上线的业务系统需要监控,然而诸如消息队列、数据库、...

癫狂侠
05/28
0
0
php| 初探 rabbitmq

date: 2018-09-03 21:30:23 title: php| 初探 rabbitmq description: 零零散散折腾了 rabbitmq 几次, 归纳总结一下先 经常看到消息队列( MQ ), 实战中比较少, 说说我的一些粗线的理解: 引入消...

daydaygo
09/05
0
0
消息中间件—RabbitMQ(集群原理与搭建篇)

摘要:实际生产应用中都会采用消息队列的集群方案,如果选择RabbitMQ那么有必要了解下它的集群方案原理 一般来说,如果只是为了学习RabbitMQ或者验证业务工程的正确性那么在本地环境或者测试...

癫狂侠
05/25
0
0
rabbitmq——heartbeat

heartbeat通常用来检测通信的对端是否存活(未正常关闭socket连接而异常crash)。其基本原理是检测对应的socket连接上数据的收发是否正常,如果一段时间内没有收发数据,则向对端发送一个心跳...

hncscwc
2014/01/23
0
9
【消息中间件RabbitMQ】Spring AMQP分析与实战视频教程

视频地址 http://edu.51cto.com/course/10627.html 视频大纲 AMQP协议介绍 RabbitMQ的安装,RabbitMQ web管理,监控管理 Exchange介绍 direct Exchang topic Exchange faont Exchange headers......

刘宗泽
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

no such module 'pop'问题

在github上 clone 了一个 swift 项目,编译时提示"no such module 'POP'"错误,查了一下居然是因为podfile中指定的最低版本是iOS 11.0,大于我测试手机的iOS版本10.3.3,将Podfile中的最低版...

yoyoso
今天
1
0
redis 系列一 -- 简介及安装

1.简介 redis -- remote dictionary server 远程字典服务 使用 C 语言编写; 高性能的 key-value数据库; 内存数据库,支持数据持久化。 Redis 是一个开源(BSD许可)的,内存中的数据结构存...

imbiao
今天
3
0
nginx log记录请求响应时间

有时为了方便分析接口性能等,需要记录请求的时长,通过修改nginx的日志格式可以做到,如 添加一个新的log_format log_format timed_combined '$remote_addr - $remote_user [$time_local] "...

swingcoder
今天
4
0
Spring MVC之RequestMappingHandlerMapping匹配

对于RequestMappingHandlerMapping,使用Spring的同学基本都不会陌生,该类的作用有两个: 通过request查找对应的HandlerMethod,即当前request具体是由Controller中的哪个方法进行处理; 查...

爱宝贝丶
今天
5
0
Java Web--增删改查之二界面后台java代码(转载参考)

/** *  *//** * @author Administrator * */package dao; import java.sql.*;public class DBConn {/** * 链接数据库 * @return */  ...

小橙子的曼曼
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部