您好,欢迎访问一九零五行业门户网

PHP AMQP 扩充 应用

php amqp 扩展 应用
周末休息 ,闲来研究下amqp 的php 扩展,花了一天时间才调试好
高级消息队列协议(amqp)是一个异步消息传递所使用的应用层协议规范。作为线路层协议,而不是api(例如jms),amqp 客户端能够无视消息的来源任意发送和接受信息。现在,已经有相当一部分不同平台的服务器和客户端可以投入使用
我的amqp服务器是使用rabbitmq ,rabbitmq 的安装网上很多。
重点说下 php 的扩展 php-amqp,我用的是最新的 amqp-1.0.1
文档是旧的 新的掺杂在一起 因此弄了好久才完成。
首先说下流程 即 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 的实现:
生产消息:
'localhost', 'port' => '5672', 'login' => 'guest', 'password' => 'guest');$conn = new amqpconnection($conn_args);if ($conn->connect()) { echo established a connection to the broker \n;}else { echo cannot connect to the broker \n ;}//你的消息$message = json_encode(array('hello world!','php','c++'));//创建channel$channel = new amqpchannel($conn);//创建exchange $ex = new amqpexchange($channel);$ex->setname('exchange');//创建名字$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('queue');$q->setflags(amqp_durable | amqp_autodelete);echo queue status: .$q->declare();echo \n;echo 'queue bind: '.$q->bind('exchange','route.key');//将你的队列绑定到routingkeyecho \n;$channel->starttransaction();echo send: .$ex->publish($message, 'route.key'); //将你的消息通过制定routingkey发送$channel->committransaction();$conn->disconnect();?>
接收方 消费方
'localhost', 'port' => '5672', 'login' => 'guest', 'password' => 'guest' ,'vhost'=>'/');$conn = new amqpconnection($conn_args);$conn->connect();$channel = new amqpchannel($conn);$q = new amqpqueue($channel);$q->setname('queue2');$q->setflags(amqp_durable | amqp_autodelete);echo queue status: .$q->declare();echo ==========\n; $messages = $q->get(amqp_autoack);print_r($messages->getbody());echo \n;// disconnect$conn->disconnect();?>
我是初学 消息队列这方面知识。
不知道 linux的消息队列 和amqp 的 优缺点
我用php 的sysvmsg 函数 执行while 循环 可以挂起在服务器上,实时监听消息队列的消息,有消息则取,内存不会升高
而用amqp while 循环 监听 即使无消息  内存也会越来越高,最后导致php 使用内存不足而 报错。
看来这方面得多交流 多学习
其它类似信息

推荐信息