php amqp消息队列教程1-代码实现实例

来源:互联网 发布:云计算的三种形式 编辑:程序博客网 时间:2024/05/21 17:57
两年前曾发过一篇《用Python尝试RabbitMQ》,没想到两年后的今天,基于PHP的amqp资料还是少得可怜,原来的几个扩展也都一个个被废弃,只剩amqp还健在,且被PECL收录。虽说被收录,可官方手册中的信息还是略显单薄。
言归正传,amqp扩展的安装就不多说了,可参看前几天发的那篇《给PHP安装amqp扩展
装好了amqp后就可以开始编写代码了:

消费者:接收消息

逻辑:
创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息

  1. <?php    
  2. /************************************* 
  3.  * PHP amqp(RabbitMQ) Demo - consumer 
  4.  * Author: Linvo 
  5.  * Date: 2012/7/30 
  6.  *************************************/  
  7. //配置信息  
  8. $conn_args = array(  
  9.     'host' => '192.168.1.93',   
  10.     'port' => '5672',   
  11.     'login' => 'guest',   
  12.     'password' => 'guest',  
  13.     'vhost'=>'/'  
  14. );    
  15. $e_name = 'e_linvo'//交换机名  
  16. $q_name = 'q_linvo'//队列名  
  17. $k_route = 'key_1'//路由key  
  18.   
  19. //创建连接和channel  
  20. $conn = new AMQPConnection($conn_args);    
  21. if (!$conn->connect()) {    
  22.     die("Cannot connect to the broker!\n");    
  23. }    
  24. $channel = new AMQPChannel($conn);    
  25.   
  26. //创建交换机     
  27. $ex = new AMQPExchange($channel);    
  28. $ex->setName($e_name);  
  29. $ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型   
  30. $ex->setFlags(AMQP_DURABLE); //持久化  
  31. echo "Exchange Status:".$ex->declare()."\n";    
  32.     
  33. //创建队列     
  34. $q = new AMQPQueue($channel);  
  35. $q->setName($q_name);    
  36. $q->setFlags(AMQP_DURABLE); //持久化   
  37. echo "Message Total:".$q->declare()."\n";    
  38.   
  39. //绑定交换机与队列,并指定路由键  
  40. echo 'Queue Bind: '.$q->bind($e_name$k_route)."\n";  
  41.   
  42. //阻塞模式接收消息  
  43. echo "Message:\n";    
  44. while(True){  
  45.     $q->consume('processMessage');    
  46.     //$q->consume('processMessage', AMQP_AUTOACK); //自动ACK应答   
  47. }  
  48. $conn->disconnect();    
  49.   
  50. /** 
  51.  * 消费回调函数 
  52.  * 处理消息 
  53.  */  
  54. function processMessage($envelope$queue) {  
  55.     $msg = $envelope->getBody();  
  56.     echo $msg."\n"//处理消息  
  57.     $queue->ack($envelope->getDeliveryTag()); //手动发送ACK应答  
  58. }  

生产者:发送消息

逻辑:
创建连接-->创建channel-->创建交换机对象-->发送消息

  1. <?php    
  2. /************************************* 
  3.  * PHP amqp(RabbitMQ) Demo - publisher 
  4.  * Author: Linvo 
  5.  * Date: 2012/7/30 
  6.  *************************************/  
  7. //配置信息  
  8. $conn_args = array(  
  9.     'host' => '192.168.1.93',   
  10.     'port' => '5672',   
  11.     'login' => 'guest',   
  12.     'password' => 'guest',  
  13.     'vhost'=>'/'  
  14. );    
  15. $e_name = 'e_linvo'//交换机名  
  16. //$q_name = 'q_linvo'; //无需队列名  
  17. $k_route = 'key_1'//路由key  
  18.   
  19. //创建连接和channel  
  20. $conn = new AMQPConnection($conn_args);    
  21. if (!$conn->connect()) {    
  22.     die("Cannot connect to the broker!\n");    
  23. }    
  24. $channel = new AMQPChannel($conn);    
  25.   
  26. //消息内容  
  27. $message = "TEST MESSAGE! 测试消息!";    
  28.   
  29. //创建交换机对象     
  30. $ex = new AMQPExchange($channel);    
  31. $ex->setName($e_name);    
  32.   
  33. //发送消息  
  34. //$channel->startTransaction(); //开始事务   
  35. for($i=0; $i<5; ++$i){  
  36.     echo "Send Message:".$ex->publish($message$k_route)."\n";   
  37. }  
  38. //$channel->commitTransaction(); //提交事务  
  39.   
  40. $conn->disconnect();    

需要注意的地方是:

queue对象有两个方法可用于取消息:consume和get。
前者是阻塞的,无消息时会被挂起,适合循环中使用;

后者则是非阻塞的,取消息时有则取,无则返回false。

测试截图

运行消费者:


运行生产者,发消息:


消费者接收到消息:

0 0
原创粉丝点击