RabbitMQ学习之PHP AMQP拓展安装

##介绍

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/src
wget 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.gz

cd rabbitmq-c-0.4.1/
#编译库
autoreconf -i
./configure --prefix=/usr/local/rabbitmq-c
make && 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.tgz
tar zxvf amqp-1.4.0.tgz

cd 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值