PHP AMQP實踐應用

2021-08-10 05:47:12 字數 2911 閱讀 4930

php-amqp實踐應用

dream

優點:可以解決伺服器處理的併發問題。

高階訊息佇列協議(amqp)是乙個非同步訊息傳遞所使用的應用層協議規範。作為線路層協議,而不是api(例如jms),amqp 客戶端能夠無視訊息的**任意傳送和接受資訊。現在,已經有相當一部分不同平台的伺服器和客戶端可以投入使用。

(一)基本概念

rabbitmq 是流行的開源訊息佇列系統,用erlang語言開發。我曾經對這門語言挺有興趣,學過一段時間,後來沒堅持。rabbitmq是amqp(高階訊息佇列協 議)的標準實現。如果不熟悉amqp,直接看rabbitmq的文件會比較困難。不過它也只有幾個關鍵概念,這裡簡單介紹。

rabbitmq的結構圖如下:

幾個概念說明:

broker:簡單來說就是訊息佇列伺服器實體。

exchange:訊息交換機,它指定訊息按什麼規則,路由到哪個佇列。

queue:訊息佇列載體,每個訊息都會被投入到乙個或多個佇列。

binding:繫結,它的作用就是把exchange和queue按照路由規則繫結起來。

routing key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。

vhost:虛擬主機,乙個broker裡可以開設多個vhost,用作不同使用者的許可權分離。

producer:訊息生產者,就是投遞訊息的程式。

consumer:訊息消費者,就是接受訊息的程式。

channel:訊息通道,在客戶端的每個連線裡,可建立多個channel,每個channel代表乙個會話任務。

(二)使用流程

即 client - amqp server - client

左邊的client向右邊的client傳送訊息,流程:

1,  獲取conection

2,  獲取channel

3,  定義exchange,queue

4,  使用乙個routingkey將queue binding到乙個exchange上

5,  通過指定乙個exchange和乙個routingkey來將訊息傳送到對應的queue上,

6,  接收方在接收時也是獲取connection,接著獲取channel,然後指定乙個queue直接到它關心的queue上取訊息,它對exchange,routingkey及如何binding都不關心,到對應的queue上去取訊息就ok了 

(三)例子

生產方:

<?php

$conn_args = array('host' =>'localhost', 'port' => 5672, 'login' => 'guest', 'password' => 'guest', 'vhost' => '/');

$conn = new amqpconnection($conn_args);

if ($conn->connect()) else

$e_name='ex_test5';//交換機名橫

$q_name='q_test5';//佇列名稱

$r_key='key_test1';

//你的訊息

$message = json_encode(array('hello world!'));

//建立channel

$channel = new amqpchannel($conn);

//建立exchange

$ex = new amqpexchange($channel);

$ex->setname($e_name);//建立名字

$ex->settype(amqp_ex_type_direct);

$ex->setflags(amqp_durable | amqp_autodelete);

echo "exchange status:".$ex->declare();

echo "n";

//建立佇列

$q = new amqpqueue($channel);

//設定佇列名字 如果不存在則新增

$q->setname($q_name);

$q->setflags(amqp_durable | amqp_autodelete);

echo "queue status: ".$q->declare();

echo "n";

echo 'queue bind: '.$q->bind($e_name,$r_key);//將你的佇列繫結到routingkey

echo "n"; 

$channel->starttransaction();

echo "send: ".$ex->publish($message, $r_key); //將你的訊息通過制定routingkey傳送

$channel->committransaction();

$conn->disconnect();

?>

消費方<?php

$conn_args = array('host' =>'localhost', 'port' => 5672, 'login' => 'guest', 'password' => 'guest', 'vhost' => '/');

//$q_name='q_test6';//佇列名稱

$q_name=$_get['q'];//佇列名稱

$conn = new amqpconnection($conn_args); 

$conn->connect(); 

$channel = new amqpchannel($conn); 

$q = new amqpqueue($channel); 

$q->setname($q_name); 

$q->setflags(amqp_durable | amqp_autodelete); 

while($a=$q->declare())

$conn->disconnect();

?>

Caffe 應用實踐

一 資料整理 1 資料處理 標註類標籤 資料打亂 shuf 2 轉換成caffe可讀的leveldb或者lmdb儲存。build tools convert imageset backend lmdb resize heiht 45 resize width 45 image data print ...

dokuwiki 應用實踐

root leekwen cat etc issue centos release 6.5 final kernel r on an m root leekwen uname ra linux leekwen 2.6.32 573.22.1.el6.x86 64 1 smp wed mar 23 0...

nginx web)應用實踐

錯誤日誌功能 nginx錯誤日誌一般分為 debug info notice warn error crit alert emerg 這幾個級別。一般 執行 warn error crit 這2個級別。預設開啟 crit 級別。建議開啟error。這裡不要把級別調的太低。會產生大量的日誌。消耗磁碟i...