RabbitMq基础二之direct模式
生产者代码:
$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"}
PHP中常见的问题点,知识点,及盲点。

浙公网安备 33010602011771号