`

[转载]PHP-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();
?>

分享到:
评论

相关推荐

    spring-boot-starter-amqp-2.1.3.RELEASE.jar

    java运行依赖jar包

    JMeter-Rabbit-AMQP-0.0.1-SNAPSHOT.jar

    JMeter-Rabbit-AMQP解决中文乱码问题,加入编码格式UTF-8的编码格式,发送MQ的时候传中文可以正常显示

    Laravel开发-laravel-amqp

    总的来说,`laravel-amqp` 包为 Laravel 和 Lumen 应用提供了简单易用的 AMQP 集成,帮助开发者充分利用消息队列的优势,提升应用的性能和可靠性。通过熟练掌握这个包的使用,你可以更高效地处理异步任务,构建出...

    spring-amqp-2.0.3.RELEASE.jar

    spring-amqp-2.0.3.RELEASE.jar

    spring-amqp-1.4.0.RELEASE.jar

    spring-amqp-1.4.0.RELEASE.jar 官方正版jar包下载

    spring-boot-starter-amqp-2.2.0.RELEASE.jar

    spring-boot-starter-amqp-2.2.0.RELEASE

    JMeter-Rabbit-AMQP.rar

    `amqp-client-3.4.4.jar` 是RabbitMQ官方提供的AMQP客户端库,它允许Java应用程序与RabbitMQ服务器建立连接,发布和接收消息。这个版本的客户端库支持AMQP 0-9-1协议,这是RabbitMQ最常用的一种协议版本。 `JMeter-...

    activemq-amqp-5.8.0.jar

    activemq-amqp-5.8.0.jar

    spring-cloud-config + spring-cloud-bus-amqp实现分布式集群配置动态更新

    Spring Cloud Config 和 Spring Cloud Bus AMQP 的结合使用为解决这一问题提供了一种优雅的解决方案。让我们深入探讨这两个组件以及它们如何协同工作来实现配置的动态更新。 Spring Cloud Config 是一个用于微服务...

    spring-amqp-2.2.0.RELEASE.jar

    spring-amqp-2.2.0.RELEASE

    spring-amqp 相关jar

    3. `org.springframework.web.servlet-3.1.1.RELEASE.jar`:这个模块主要用于构建 Web MVC 应用,虽然不是 Spring AMQP 的直接依赖,但它可能用于构建与 AMQP 集成的 Web 应用。 4. `org.springframework.web-3.1.1...

    apollo-amqp-1.7.jar

    标签:apollo-amqp-1.7.jar,apollo,amqp,1.7,jar包下载,依赖包

    laravel-amqp:Laravel和Lumen的AMQP包装器可以发布和使用消息

    5.5 ) $ php composer update 或者$ php composer require bschmitt/laravel-amqp一体化流明在Lumen应用程序的根目录中创建一个config文件夹,然后将内容从vendor / bschmitt / laravel-amqp /

    php-amqp-stubs:通过 packagist 的 php-amqp (pdezwartphp-amqp) 存根

    php-amqp-存根通过 packagist 的 php-amqp (pdezwart/php-amqp) 存根如果您需要在没有 php-amqp 扩展的环境(例如您的桌面)中对您的 php-amqp 设置进行单元测试的存根,只需将 "empi89/...composer.json ....

    rust-amqp, 在纯 Rust 中,AMQP客户端 对应rabbitmq规范.zip

    rust-amqp, 在纯 Rust 中,AMQP客户端 对应rabbitmq规范 纯 Rust 中的AMQ协议。注意:项目仍处于开发阶段,它实现了所有协议解析,但并不包括所有协议方法。 预计将来会改变 API 。目前可以做的事情:连接到服务器...

    springboot-rabbitmq-amqp

    SpringBoot与RabbitMQ结合使用AMQP协议是现代企业级应用程序中常见的消息中间件解决方案。本文将深入探讨SpringBoot如何集成RabbitMQ以及AMQP协议的基础知识,旨在帮助开发者理解和应用这一技术栈。 首先,...

    spring-amqp,spring-retry,spring-rabbit

    标题中的"spring-amqp"、"spring-retry"和"spring-rabbit"是Spring框架的三个关键组件,它们主要用于构建高效、可靠的分布式系统,尤其是在消息传递和错误处理方面。 1. **Spring AMQP**: Spring AMQP是Spring框架...

    前端开源库-amqp

    AMQP(Advanced Message Queuing Protocol)是一种开放标准的应用层协议,主要用于在分布式系统中进行可靠的消息传递。它提供了一种统一的接口,使得不同的应用程序和服务可以相互通信,即使它们运行在不同的操作...

Global site tag (gtag.js) - Google Analytics