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...