rabbitmq 要点
消息被Exchange接受以后,如果没有匹配的Queue,则会被丢弃--->>故 无论生产者还是消费者都应该在发送消息前试图创建队列
生产者想要发送消息,首先必须要声明一个Exchange和该Exchange对应的Binding(可以通过 ExchangeDeclare和BindingDeclare完成)
<?php
/*
* exchange : e1
* channel : c1
* queue : q1
* routingkey: r1
*/
//////////////////////////生产者 推送消息////////////////////////////////////
$routingkey = 'r1';
// 设置连接
$conn_args = array ('host' => 'localhost','port' => '5672','login' => 'guest','password' => 'guest');
$conn = new AMQPConnection ( $conn_args );
if ($conn->connect ()) {
echo "已经建立链接 <br />";
} else {
echo "链接失败 <br />";
}
// 创建channel
$channel = new AMQPChannel ( $conn );
// 创建exchange
$ex = new AMQPExchange ( $channel );
$ex->setName ( 'e1' ); // 创建名字
$ex->setType ( AMQP_EX_TYPE_DIRECT );
$ex->setFlags ( AMQP_DURABLE );
// $ex->setFlags(AMQP_AUTODELETE);
// echo "exchange status:".$ex->declare();
echo "交换机状态:" . $ex->declareExchange ();
echo "<br />";
// exchange 与 queue绑定
$channel = new AMQPChannel($conn);
$q = new AMQPQueue($channel);
$q->setName('q1');
$q->setFlags(AMQP_DURABLE);
$q->declare();
echo '绑定队列:',$q->bind('e1',$routingkey);
// 发送消息
for($i = 0; $i < 10; $i ++) {
// 发送数据
$message = json_encode ([time()] );
echo '设置:'.$ex->publish ( $message, $routingkey ),'<br />';
sleep(1);
}
//////////////////////////消费者 获取消息////////////////////////////////////
$bindingkey='r1';
//连接RabbitMQ
$conn_args = array( 'host'=>'127.0.0.1' , 'port'=> '5672', 'login'=>'guest' , 'password'=> 'guest','vhost' =>'/');
$conn = new AMQPConnection($conn_args);
$conn->connect();
//设置queue名称,使用exchange,绑定routingkey
$channel = new AMQPChannel($conn);
$q = new AMQPQueue($channel);
$q->setName('q1');
$q->setFlags(AMQP_DURABLE);
echo '队列长度:',$q->declare(),'<br />';
//消息获取
echo '<pre>';
for($i=0;$i<5;$i++){
$messages = $q->get(AMQP_AUTOACK) ;
var_dump(json_decode($messages->getBody(), true ));
}
$conn->disconnect();

浙公网安备 33010602011771号