php rabbitmq使用示例
发送消息,即客户端口
基本流程:
1.创建连接
2.在连接内创建一个通道
3.创建交换机
4.创建队列
5.发送信息
6.关闭
sender.php
//配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => 'guest', 'password' => 'guest', 'vhost' => '/', ); $e_name = 'e_test'; //交换机名,和服务端一致 $k_route = 'route_test'; //路由key,和服务端一致 $q_name = 'q_test'; // 队列名称 // 1.创建连接 $conn = new AMQPConnection($conn_args); if (!$conn->connect()) { die("Cannot connect to the broker!\n"); } // 2.在连接内创建一个通道 $channel = new AMQPChannel($conn); // 3.创建交换机 $ex = new AMQPExchange($channel); $ex->setName($e_name); $ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型 $ex->setFlags(AMQP_DURABLE); //持久化,不用,则去除 $ex->declareExchange(); // 4.创建队列 $q = new AMQPQueue($channel); $q->setName($q_name); $q->setFlags(AMQP_DURABLE); // 设置持久化,不用则直接去除 // 5.发送消息 //$channel->startTransaction(); //开始事务 for ($i = 0; $i < 5; ++$i) { //sleep(1); //休眠1秒 //消息内容 $message = $i . " - hi," . date("Y-m-d H:i:s",time()); echo "Send Message - " . $i . ' : ' . $ex->publish($message, $k_route) . date("Y-m-d H:i:s",time()) . "\n"; } //$channel->commitTransaction(); //提交事务 // 6.关闭 $conn->disconnect();
创建服务端,即消费者
基本流程:
1.创建连接
2.在连接内创建一个通道
3.创建交换机
4.设置交换机类型
5.设置交换机持久
6.声明交换机并输出状态
7.创建队列
8.声明消息队列并输出状态
9.绑定交换机与队列,并指定路由键
10.设置消息队列消费者回调方法,并进行阻塞
11.接收消息并进行处理的回调方法
12.关闭连接
receive.php
//配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => 'guest', 'password' => 'guest', 'vhost' => '/', ); $e_name = 'e_test'; //交换机名 与客户端一致 $q_name = 'q_test'; //队列名 与客户端一致 $k_route = 'route_test'; //路由key 与客户端一致 // 1.创建连接和channel $conn = new AMQPConnection($conn_args); if (!$conn->connect()) { die("Cannot connect to the broker!\n"); } // 2.在连接内创建一个通道 $channel = new AMQPChannel($conn); // 3.创建交换机 $ex = new AMQPExchange($channel); $ex->setName($e_name); // 4.设置交换机类型 //AMQP_EX_TYPE_DIRECT:直连交换机 //AMQP_EX_TYPE_FANOUT:扇形交换机 //AMQP_EX_TYPE_HEADERS:头交换机 //AMQP_EX_TYPE_TOPIC:主题交换机 $ex->setType(AMQP_EX_TYPE_DIRECT); // 5.设置交换机持久 $ex->setFlags(AMQP_DURABLE); // 6.声明交换机并输出状态 echo "Exchange Status:" . $ex->declareExchange() . "\n"; // 7.创建队列 $q = new AMQPQueue($channel); $q->setName($q_name); //设置队列持久 $q->setFlags(AMQP_DURABLE); // 8.声明消息队列并输出状态 echo "Message Total:" . $q->declareQueue() . "\n"; // 9.绑定交换机与队列,并指定路由键 echo 'Queue Bind: ' . $q->bind($e_name, $k_route) . "\n"; // 10.设置消息队列消费者回调方法,并进行阻塞 echo "waiting reeive Message...\n"; // 11.接收消息并进行处理的回调方法 function processMessage($envelope, $queue) { //取消息内容 $msg = $envelope->getBody(); echo $msg . "\n"; //处理消息 //显式确认,队列收到消费者显式确认后,会删除该消息 $queue->ack($envelope->getDeliveryTag()); } //设置消息队列消费者回调方法,并进行阻塞 $q->consume('processMessage'); //下面是隐式确认,不推荐 //$q->consume('processMessage', AMQP_AUTOACK); // 12. 关闭连接 $conn->disconnect();
// 以下是融合为 Publish/Subscribe 模式
class Mq{ const EX_NAME= 'mq_publish'; private $config = array('host' => '127.0.0.1','port' => 5672,'login' => 'guest','password' => 'guest'); private $conn; private $channel; private $ex; // 连接服务器,建立通道,建立交换机 function commonConnection(){ $this->conn = new AMQPConnection($this->config); if(!$this->conn->connect()){ die('connection failure!'); } $this->channel = new AMQPChannel($this->conn); $this->ex = new AMQPExchange($this->channel); $this->ex->setName(self::EX_NAME); $this->ex->setType(AMQP_EX_TYPE_FANOUT); $this->ex->setFlags(AMQP_DURABLE); $this->ex->declareExchange(); } // 发布消息 function publish(){ $this->commonConnection(); for($i = 1; $i <= 10;$i++){ $msg = 'Hello fanout: ' . $i; echo $msg . PHP_EOL; $this->ex->publish($msg); } $this->conn->disconnect(); } function subscribe1 ($queue_name = 'q1'){ $this->commonConnection(); $queue = new AMQPQueue($this->channel); $queue->setName($queue_name); $queue->setFlags(AMQP_DURABLE); $queue->declareQueue(); $queue->bind($this->ex->getName()); try{ $queue->consume(function($envelope,$q){ echo 'subscribe1:' . $queue_name .' - '. $envelope->getBody() . PHP_EOL; $q->ack($envelope->getDeliveryTag()); }); }catch (\Exception $e){ echo $e->getMessage(); } } function subscribe2($queue_name = 'q2'){ $this->commonConnection(); $queue = new AMQPQueue($this->channel); $queue->setName($queue_name); $queue->setFlags(AMQP_DURABLE); $queue->declareQueue(); $queue->bind($this->ex->getName()); try{ $queue->consume(function($envelope,$q){ echo 'subscribe2:' . $queue_name .' - '. $envelope->getBody() . PHP_EOL; $q->ack($envelope->getDeliveryTag()); }); }catch (\Exception $e){ echo $e->getMessage(); } } }