[转载]PHP-AMQP实践应用_PHP_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > PHP > [转载]PHP-AMQP实践应用

[转载]PHP-AMQP实践应用

 2017/11/2 23:11:31  18237103303  程序员俱乐部  我要评论(0)
  • 摘要:原文地址:PHP-AMQP实践应用作者:dream优点:可以解决服务器处理的并发问题。高级消息队列协议(AMQP)是一个异步消息传递所使用的应用层协议规范。作为线路层协议,而不是API(例如JMS),AMQP客户端能够无视消息的来源任意发送和接受信息。现在,已经有相当一部分不同平台的服务器和客户端可以投入使用。(一)基本概念RabbitMQ是流行的开源消息队列系统,用erlang语言开发。我曾经对这门语言挺有兴趣,学过一段时间,后来没坚持。RabbitMQ是AMQP(高级消息队列协议
  • 标签:PHP 应用
原文地址:PHP-AMQP实践应用作者:dream 优点:可以解决服务器处理的并发问题。

高级消息队列协议(AMQP)是一个异步消息传递所使用的应用层协议规范。作为线路层协议,而不是API(例如JMS),AMQP 客户端能够无视消息的来源任意发送和接受信息。现在,已经有相当一部分不同平台的服务器和客户端可以投入使用。

(一)基本概念

RabbitMQ 是流行的开源消息队列系统,用erlang语言开发。我曾经对这门语言挺有兴趣,学过一段时间,后来没坚持。RabbitMQ是AMQP(高级消息队列协 议)的标准实现。如果不熟悉AMQP,直接看RabbitMQ的文档会比较困难。不过它也只有几个关键概念,这里简单介绍。

RabbitMQ的结构图如下:

php amqp实例 - zhukeqing - 大 鱼 鱼 ?

几个概念说明:

Broker:简单来说就是消息队列服务器实体。

Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。

Queue:消息队列载体,每个消息都会被投入到一个或多个队列。

Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

Routing Key:路由关键字,exchange根据这个关键字进行消息投递。

vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。

producer:消息生产者,就是投递消息的程序。

consumer:消息消费者,就是接受消息的程序。

channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

(二)使用流程

即 Client - AMQP server - Client

左边的Client向右边的Client发送消息,流程:

1,??获取Conection

2,??获取Channel

3,??定义Exchange,Queue

4,??使用一个RoutingKey将Queue Binding到一个Exchange上

5,??通过指定一个Exchange和一个RoutingKey来将消息发送到对应的Queue上,

6,??接收方在接收时也是获取connection,接着获取channel,然后指定一个Queue直接到它关心的Queue上取消息,它对Exchange,RoutingKey及如何binding都不关心,到对应的Queue上去取消息就OK了?

(三)例子


生产方:

<?php
$conn_args = array('host' =>'localhost', 'port' => 5672, 'login' => 'guest', 'password' => 'guest', 'vhost' => '/');
$conn = new AMQPConnection($conn_args);
if ($conn->connect()) {
????echo "Established a connection to the broker n";
}else {
????echo "Cannot connect to the broker n ";
}
$e_name='ex_test5';//交换机名横
$q_name='q_test5';//队列名称
$r_key='key_test1';

//你的消息
$message = json_encode(array('Hello World!'));
//创建channel
$channel = new AMQPChannel($conn);
//创建exchange
$ex = new AMQPExchange($channel);
$ex->setName($e_name);//创建名字
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);
echo "exchange status:".$ex->declare();
echo "n";
//创建队列
$q = new AMQPQueue($channel);
//设置队列名字 如果不存在则添加
$q->setName($q_name);
$q->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);
echo "queue status: ".$q->declare();
echo "n";
echo 'queue bind: '.$q->bind($e_name,$r_key);//将你的队列绑定到routingKey
echo "n";?

$channel->startTransaction();
echo "send: ".$ex->publish($message, $r_key); //将你的消息通过制定routingKey发送
$channel->commitTransaction();
$conn->disconnect();
?>

消费方

<?php
$conn_args = array('host' =>'localhost', 'port' => 5672, 'login' => 'guest', 'password' => 'guest', 'vhost' => '/');

//$q_name='q_test6';//队列名称
$q_name=$_GET['q'];//队列名称

$conn = new AMQPConnection($conn_args);?
$conn->connect();?
$channel = new AMQPChannel($conn);?
$q = new AMQPQueue($channel);?
$q->setName($q_name);?
$q->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);?

while($a=$q->declare())
{
????echo "queue status: ".$a;
????echo "==========n";

????$messages = $q->get(AMQP_AUTOACK);
????print_r($messages->getBody());?
????echo "n";?
}
$conn->disconnect();
?>

发表评论
用户名: 匿名