1. 程式人生 > >用PHP Demo 學 RabbitMq

用PHP Demo 學 RabbitMq

先安裝rabbitmq的php擴充套件amqp,至於為何是amqp,稍微搜尋一下就會了解rabbitmq是基於amqp協議的。

概要

我們先大致瞭解一下rabbitmq,簡單的說就是一個生產者-消費者模式的訊息佇列,支援訊息持久化。同時需要了解幾個名詞,以及這幾個名詞之間的聯絡

  1. 生產者(producer)
  2. 通道(channel)
  3. 訊息交換機(exchange)
  4. 訊息佇列(queue)
  5. 消費者(consumer)
  6. 路由關鍵詞

工作流程

生產者產生的訊息通過通道投遞到某個訊息交換機上,投遞過程中指定了一個路由關鍵字,訊息交換機將這條訊息投遞到不同的訊息佇列中的時候,依據路由關鍵字,該訊息可能會被投遞到某一個或者某幾個符合路由規則的訊息佇列中,消費者從訊息佇列中取出訊息進行後一步處理。

分發機制

當多個消費者同時在消費同一個訊息佇列的時候,rabbitmq會順序分發佇列中message,當每個message收到ack,就會將這條訊息從訊息佇列中刪除,這種分發的機制叫做round-robin
這裡不過多討論rabbitmq的訊息分發機制,有興趣可以參考這個銜接
RabbitMQ訊息佇列(三):任務分發機制

Demo

$conn_args = array(
        'host'=>'127.0.0.1',  //rabbitmq 伺服器host
        'port'=>5672,         //rabbitmq 伺服器埠
        'login'
=>'guest', //登入使用者 'password'=>'guest', //登入密碼 'vhost'=>'/' //虛擬主機 ); $e_name = 'e_demo'; $q_name = 'q_demo'; $k_route = 'key_1'; $conn = new AMQPConnection($conn_args); if(!$conn->connect()){ die('Cannot connect to the broker'); } $channel = new AMQPChannel($conn
); $ex = new AMQPExchange($channel); $ex->setName($e_name); $ex->setType(AMQP_EX_TYPE_DIRECT); $ex->setFlags(AMQP_DURABLE); $status = $ex->declareExchange(); //宣告一個新交換機,如果這個交換機已經存在了,就不需要再呼叫declareExchange()方法了. $q = new AMQPQueue($channel); $q->setName($q_name); $status = $q->declareQueue(); //同理如果該佇列已經存在不用再呼叫這個方法了。 $ex->publish($msg, $k_route);

以上程式碼就構造了一個生產者,並投遞了一條訊息到rabbitmq中。

$conn_args = array(
        'host'=>'127.0.0.1',
        'port'=>5672,
        'login'=>'guest',
        'password'=>'guest',
        'vhost'=>'/'
    );
$e_name = 'e_demo';
$q_name = 'q_demo';
$k_route = 'key_1';


$conn = new AMQPConnection($conn_args);
if(!$conn->connect()){
    die('Cannot connect to the broker');
}
$channel = new AMQPChannel($conn);
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE);

$q = new AMQPQueue($channel);
var_dump($q);
$q->setName($q_name);
$q->bind($e_name, $k_route);

$arr = $q->get();
var_dump($arr);
$res = $q->ack($arr->getDeliveryTag());
$msg = $arr->getBody();
var_dump($msg);

以上程式碼構建了一個消費者,並從訊息佇列中拿出一條訊息,並把該訊息從佇列中移除。

補充

補充說明一下rabbitmq的使用命令
rabbitmq-server start是啟動rabbitmq服務。
主要的管理rabbitmq使用的是rabbitctl命令

  • rabbitmqctl start_app 啟動rabbitmq
  • rabbitmqctl stop_app 關閉rabbitmq
  • rabbitmqctl reset 重置rabbitmq佇列
  • rabbitmqctl list_queues 檢視rabbitmq中佇列
  • rabbitmqctl list_exchanges 檢視rabbitmq中的交換機