RabbitMQ實現生產者和消費者(帶註釋)

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應答,若不發送則可以只讀不消費。
}

?>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章