1、生产者:rabbitmq_publisher.php
<?php
date_default_timezone_set("Asia/Shanghai");
//配置信息
$conn_args = array(
'host' => '127.0.0.1',
'port' => '5672',
'login' => '******',
'password' => '******',
'vhost'=>'/'
);
$item_ex_name = 'queen_item'; //单个店铺交换机名
$all_ex_name = 'queen_all'; //所有店铺持久化交换机名
//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$item_channel = new AMQPChannel($conn);//单个店铺通道
//创建交换机对象
$item_ex = new AMQPExchange($item_channel);
$item_ex->setName($item_ex_name);
//发送消息
//$channel->startTransaction(); //开始事务
for($i=0; $i<5; $i++){
sleep(1);//休眠1秒
//消息内容
$item_message = "TEST MESSAGE(item):".date("Y-m-d h:i:s",time());
echo date("Y-m-d h:i:s",time()) . "Send Message(item):" . $item_ex->publish($item_message, $item_route)."\n";
}
//$channel->commitTransaction(); //提交事务
$conn->disconnect();
?>
2、消费者:rabbitmq_consumer.php
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
//配置信息
$conn_args = array(
'host' => '127.0.0.1',
'port' => '5672',
'login' => '******',
'password' => '******',
'vhost'=>'/'
);
$item_ex_name = 'queen_item'; //交换机名
$item_queen_name = 'queen_shop_1'; //队列名
$item_route = 'shop_1'; //单个店铺队里路由key(格式:shop_id)
//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$item_channel = new AMQPChannel($conn);
//创建交换机
$item_ex = new AMQPExchange($item_channel);
$item_ex->setName($item_ex_name);
$item_ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型
$item_ex->setFlags(AMQP_DURABLE); //持久化
echo "Exchange Status(item):".$item_ex->declare()."\n";
//在某个交换机下创建队列
$item_queen = new AMQPQueue($item_channel);
$item_queen->setName($item_queen_name);
$item_queen->setFlags(AMQP_DURABLE); //持久化
echo "Message Total:".$item_queen->declare()."\n";
//通过路由绑定交换机与队列
echo 'Queue Bind(item): '.$item_queen->bind($item_ex_name, $item_route)."\n";
//阻塞模式接收消息
echo "Message:\n";
while(True){
$item_queen->consume('itemMessage');
//$q->consume('processMessage', AMQP_AUTOACK); //自动ACK应答
}
$conn->disconnect();
/**
* 消费回调函数
* 处理消息
*/
function itemMessage($envelope, $queue) {
$msg = $envelope->getBody();
echo $msg."\n"; //处理消息
$queue->ack($envelope->getDeliveryTag()); //处理成功后手动发送ACK应答,若不发送则可以只读不消费。
}
?>