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
- RabbitMQ学习之PHP AMQP拓展安装
- rabbitmq php扩展amqp安装
- php的amqp扩展 安装(windows) rabbitmq学习篇
- php amqp 消息队列 RabbitMQ 安装(一)
- centos安装php的rabbitmq扩展amqp
- php 的rabbitmq 扩展模块amqp安装
- AMQP之RabbitMQ安装与配置
- 学习rabbitmq(1) AMQP
- php 安装 rabbitMQ 扩展 amqp 【一键安装脚本】
- AMQP之RabbitMq
- rabbitmq入门和ubuntu下安装php-amqp
- debian(wheezy)安装rabbitMQ,php-amqp来支持消息队列.
- linux编译安装rabbitmq-c & 编译PHP扩展amqp
- windows下安装rabbitmq的php扩展amqp
- linux编译安装rabbitmq-c & 编译PHP扩展amqp
- RabbitMQ学习之spring-amqp的重要类的认识
- [AMQP] RabbitMQ 安装与测试
- AMQP之QPID和RabbitMQ
- 8位10进制数变成32进制数
- C语言strtol()函数:将字符串转换成long(长整型数)
- 关于自定义控件和属性时TypedArray.getDimension应当注意的问题
- Ubuntu下使用git在github托管代码
- iOS 多个label/button自动换行
- RabbitMQ学习之PHP AMQP拓展安装
- 自实现简单线程池
- Vuex初探之旅
- JCF treeset的用法实例
- 构建基于Jenkins + Github的持续集成环境
- [leetcode]215. Kth Largest Element in an Array
- jquery ajax在跨域访问post请求的时候,ie9以下无效(包括ie9)
- 一对一 一对多 多对多
- 初步认识:jqGrid