PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (四) -- Push API 和 Pull API
RabbitMQ 中针对消息的分发提供了 Push API (订阅模式) 和 Pull API (主动获取) 两种模式. 在 PHP 中, 这两种模式分别通过 AMQPQueue 类中的 consume 和 get 方法实现.
Push API -- consume 方法
consume 简单示例
$conConfig = [ 'host' => '127.0.0.1', 'port' => 5672, 'login' => 'root', 'password' => 'root', 'vhost' => '/' ]; try { $con = new AMQPConnection($conConfig); $con->connect(); if(!$con->isConnected()) { echo '连接失败';die; } $channel = new AMQPChannel($con); $exchange = new AMQPExchange($channel); $exchange->setType('fanout'); $exchange->setName('test.ex1'); $exchange->declareExchange(); $queue = new AMQPQueue($channel); $queue->setName('test.consume'); $queue->declareQueue(); $queue->bind($exchange->getName()); $queue->consume(function($envelope, $queue) { echo date('Y-m-d H:i:s') . ': ' . $envelope->getBody() . PHP_EOL; }, AMQP_AUTOACK); $con->disconnect(); }catch(Exception $e) { echo $e->getMessage(); }
通过 consume 方法通过轮询方式持续从队列获取消息. 当有新消息从交换机分发到队列时, 客户端会自动处理新消息, 不用再主动地从队列请求获取消息.
Pull API -- get 方法
get 示例
$conConfig = [ 'host' => '127.0.0.1', 'port' => 5672, 'login' => 'root', 'password' => 'root', 'vhost' => '/' ]; try { $con = new AMQPConnection($conConfig); $con->connect(); if(!$con->isConnected()) { echo '连接失败';die; } $channel = new AMQPChannel($con); $exchange = new AMQPExchange($channel); $exchange->setType('fanout'); $exchange->setName('test.ex1'); $exchange->declareExchange(); $queue = new AMQPQueue($channel); $queue->setName('test.get'); $queue->declareQueue(); $msgEnvelope = $queue->get(AMQP_AUTOACK); if($msgEnvelope) { $msg = $msgEnvelope->getBody(); echo $msg . PHP_EOL; } $con->disconnect(); }catch(Exception $e) { echo $e->getMessage(); }
get 方式是主动从队列获取消息. 除非主动发起请求, 否则队列中的新消息不会推送到客户端.
producer 示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
header('Content-Type: text/html; charset=utf-8'); // 连接设置 $conConfig = [ 'host' => '127.0.0.1', 'port' => 5672, 'login' => 'root', 'password' => 'root', 'vhost' => '/' ]; try { // RabbitMQ 连接实例 $con = new AMQPConnection($conConfig); // 发起连接 $con->connect(); // 判断连接结果,true成功,false失败 if(!$con->isConnected()) { echo '连接失败';die; } // 新建通道 $channel = new AMQPChannel($con); // 使用RabbitMQ的默认Exchange $exchange = new AMQPExchange($channel); $exchange->setType('fanout'); $exchange->setName('test.ex1'); $exchange->declareExchange(); $i = 1; while(1) { $state = $exchange->publish('消息' . $i++); if($state) { echo 'Success' . PHP_EOL; }else { echo 'Fail' . PHP_EOL; } sleep(1); } // 关闭连接 $con->disconnect(); }catch(Exception $e) { echo $e->getMessage(); }