生产者代码:
$conConfig = [ 'host' => '127.0.0.1', 'port' => '5672', 'login' => 'sblack', 'password' => '123456', 'vhost' => '/', ]; //direct模式 try { $connection = new AMQPConnection($conConfig); $connection->connect(); if(!$connection->isConnected()){ echo 'rabbitmq connect fail'; die(); } $e_name = "direct_change"; $k_route = array(0=>"key_1",1=>"key_2"); //新建通道 $channel = new AMQPChannel($connection); //创建交换机 $exchange = new AMQPExchange($channel); $exchange->setName($e_name); $exchange->setType(AMQP_EX_TYPE_DIRECT); //交换机类型为direcdt $exchange->setFlags(AMQP_DURABLE); //持久化 $exchange->declareExchange(); //创建队列1 $queue = new AMQPQueue($channel); $queue->setName("key_1"); $queue->setFlags(AMQP_DURABLE); $queue->declareQueue(); $queue->bind($e_name,"key_1"); //创建队列2 $queue = new AMQPQueue($channel); $queue->setName("key_2"); $queue->setFlags(AMQP_DURABLE); $queue->declareQueue(); $queue->bind($e_name,"key_2"); for($i=6;$i<20;$i++){ $message = [ 'name' => 'direct交换机,消息'.$i, 'info' => 'hello world', ]; //发送消息,为消息指定routing key,成功返回true,失败返回false $state = $exchange->publish(json_encode($message,JSON_UNESCAPED_UNICODE),$k_route[$i%2]); if($state){ echo 'success'.PHP_EOL; }else{ echo 'fail'.PHP_EOL; } } //关闭$channel $channel->close(); //关闭连接 $connection->disconnect(); } catch(Execption $e){ echo $e->getMessage(); }
执行完在MQ管理界面上会创建如下:
消费者1从key1中获取数据,消费者2从key2中获取数据:
$conConfig = [ 'host' => '127.0.0.1', 'port' => '5672', 'login' => 'sblack', 'password' => '123456', 'vhost' => '/', ]; //direct模式 try { $connection = new AMQPConnection($conConfig); $connection->connect(); if(!$connection->isConnected()){ echo 'rabbitmq connect fail'; die(); } $e_name = "direct_change"; $routkey1 = "key_1"; //新建channel $channel = new AMQPChannel($connection); //声明queue $queue = new AMQPQueue($channel); $queue->setName($routkey1); $queue->setFlags(AMQP_DURABLE); $queue->declareQueue(); $queue->consume(function($envelope,$queue){ $msg = $envelope->getBody().PHP_EOL; error_log($msg,3,"key_1.log"); },AMQP_AUTOACK); //关闭连接 $connection->disconnect(); } catch(Execption $e){ echo $e->getMessage(); }
执行结果 key_1中的消息被取出:
{"name":"direct交换机,消息6","info":"hello world"} {"name":"direct交换机,消息8","info":"hello world"} {"name":"direct交换机,消息10","info":"hello world"} {"name":"direct交换机,消息12","info":"hello world"} {"name":"direct交换机,消息14","info":"hello world"} {"name":"direct交换机,消息16","info":"hello world"} {"name":"direct交换机,消息18","info":"hello world"}