RabbitMQ学习之PHP AMQP拓展安装

来源:互联网 发布:人工蜂群算法优缺点 编辑:程序博客网 时间:2024/06/06 01:46

介绍

AMQP 简单的讲就是高级队列协议。而这个扩展就是为了让 php 可以支持 AMQP 协议与相关的队列服务通讯。

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

基本概念

RabbitMQ 是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协 议)的标准实现。如果不熟悉AMQP,直接看RabbitMQ的文档会比较困难。不过它也只有几个关键概念,这里简单介绍。

几个概念说明:

  • Broker:简单来说就是消息队列服务器实体。
  • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
  • Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
  • Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
  • Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
  • vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
  • producer:消息生产者,就是投递消息的程序。
  • consumer:消息消费者,就是接受消息的程序。
  • channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

使用流程

即 Client – AMQP server – Client
左边的Client向右边的Client发送消息,流程:

  • 获取Conection
  • 获取Channel
  • 定义Exchange,Queue
  • 使用一个RoutingKey将Queue Binding到一个Exchange上
  • 通过指定一个Exchange和一个RoutingKey来将消息发送到对应的Queue上,
  • 接收方在接收时也是获取connection,接着获取channel,然后指定一个Queue直接 到它关心的Queue上取消息,它对Exchange,RoutingKey及如何binding都不关心,到对应的Queue上去取消息就OK了

由于ubuntu的默认源里面没有php5-amqp这个包,所以要用上amqp得考手动编译。

准备

Linux软件安装之PHP。

PHP 5.6.3
rabbitmq-c-0.4.1
amqp-1.4.0.tgz

cd /usr/local/srcwget https://github.com/alanxz/rabbitmq-c/releases/download/v0.4.1/rabbitmq-c-0.4.1.tar.gz#解压tar zxvf rabbitmq-c-0.4.1.tar.gzcd rabbitmq-c-0.4.1/#编译库autoreconf -i./configure --prefix=/usr/local/rabbitmq-cmake && make install

然后我们需要去下载php扩展的源代码,地址在此:
http://pecl.php.net/package/amqp
当前最新版本为1.4.0

cd /usr/local/src/wget http://pecl.php.net/get/amqp-1.4.0.tgztar zxvf amqp-1.4.0.tgzcd amqp-1.4.0/#编译PHP插件/usr/local/php/bin/phpize #编译with-librabbitmq-dir为rabbitmq-c安装目录./configure --with-php-config=/usr/local/php/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c#安装make && make install
vim /usr/local/php/etc/php.ini#增加扩展extension=amqp.so 

然后重启你的web服务器或者php-fpm并打印phpinfo,如果见到以下的内容就说明扩展安装好了。

这里写图片描述

测试

创建消费者(worker.php)

//配置信息  $conn_args = array(      'host' => '192.168.43.135',       'port' => '5672',       'login' => 'webben',       'password' => '123456',      'vhost'=>'/'  );    $e_name = 'e_sms'; //交换机名  $q_name = 'q_register'; //队列名  $k_route = 'r_sms_register'; //路由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应答  }

生产者(client.php)

//配置信息  $conn_args = array(      'host' => '192.168.43.135',       'port' => '5672',       'login' => 'webben',       'password' => '123456',      'vhost'=>'/'  );    $e_name = 'e_sms'; //交换机名  //$q_name = 'q_register'; //无需队列名  $k_route = 'r_sms_register'; //路由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.$i, $k_route)."\n";   }  //$channel->commitTransaction(); //提交事务  $conn->disconnect();

结果如下:
这里写图片描述

这里写图片描述

测试成功。

0 0
原创粉丝点击