亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

RabbitMQ與PHP

2020-03-22 18:41:54
字體:
來源:轉載
供稿:網友
你是否遇到過兩個(多個)系統間需要通過定時任務來同步某些數據?你是否在為異構系統的不同進程間相互調用、通訊的問題而苦惱、掙扎?如果是,那么恭喜你,消息服務讓你可以很輕松地解決這些問題。消息服務擅長于解決多系統、異構系統間的數據交換(消息通知/通訊)問題,你也可以把它用于系統間服務的相互調用(RPC)。本文將要介紹的RabbitMQ就是當前最主流的消息中間件之一。

RabbitMQ簡介

AMQP ,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的中間件設計。消息中間件主要用于組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。

AMQP的主要特征是面向消息、隊列、路由(包括點對點和發布/訂閱)、可靠性、安全。

RabbitMQ 是一個開源的AMQP實現,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。網站在: http://www.rabbitmq.com/ 上面有各種語言教程和實例代碼

AMPQ協議為了能夠滿足各種消息隊列需求,在概念上比較復雜,了解了這些概念,是使用好RabbitMQ的基礎。

vhosts : html' target='_blank'>虛擬主機

虛擬主機( virtual host ):一個虛擬主機持有一組交換機、隊列和綁定。為什么需要多個虛擬主機呢? RabbitMQ 當中,用戶只能在虛擬主機的粒度進行權限控制。因此,如果需要禁止 A 組訪問 B 組的交換機 / 隊列 / 綁定,必須為 A 和 B 分別創建一個虛擬主機。每一個 RabbitMQ 服務器都有一個默認的虛擬主機 “/” 。

一個RabbitMQ的Server上可以有多個vhosts,用戶與權限設置就是依附于vhosts。對一般PHP應用,不需要用戶權限設定,直接使用默認就存在的”/”就可以了,用戶可以使用默認就存在的”guest”。一個簡單的配置示例:

$conn_args = array(    'host' => '127.0.0.1',     'port' => '5672',     'login' => 'guest',     'password' => 'guest',      'vhost'=>'/');
connection 與 channel : 連接與信道

connection是指物理的連接,一個client與一個server之間有一個連接;一個連接上可以建立多個channel,可以理解為邏輯上的連接。一般應用的情況下,有一個channel就夠用了,不需要創建更多的channel。示例代碼:

//創建連接和channel$conn = new AMQPConnection($conn_args);if (!$conn->connect()) {    die("Cannot connect to the broker!/n");}$channel = new AMQPChannel($conn);
Exchange 與 routingkey : 交換機 與 路由鍵

為了將不同類型的message進行區分,設置了Exchange交換機與Route路由兩個概念。比如,將A類型的message發送到名為‘C1’的交換機,將類型為B的發送到’C2′的交換機。當客戶端連接C1處理隊列消息時,取到的就只是A類型message。進一步的,如果A類型message也非常多,需要進一步細化區分,比如某個客戶端只處理A類型message中針對K用戶的message,routingkey就是來做這個用途的。

$e_name = 'e_linvo'; //交換機名$k_route = array(0=> 'key_1', 1=> 'key_2'); //路由key//創建交換機$ex = new AMQPExchange($channel);$ex->setName($e_name);$ex->setType(AMQP_EX_TYPE_DIRECT); //direct類型$ex->setFlags(AMQP_DURABLE); //持久化echo "Exchange Status:".$ex->declare()."/n";for($i=0; $ipublish($message . date('H:i:s'), $k_route[i%2])."/n";}

由以上代碼可以看到,發送消息時,只要有“交換機”就夠了。至于交換機后面有沒有對應的處理隊列,發送方是不用管的。routingkey可以是空的字符串。在示例中,我使用了兩個key交替發送消息,是為了下面更便于理解routingkey的作用。

對于交換機,有兩個重要的概念:

交換機( Exchange ):可以理解成具有路由表的路由程序。每個消息都有一個路由鍵( routing key ),就是一個簡單的字符串。交換機中有一系列的綁定( binding ),即路由規則( routes )。交換機可以有多個。多個隊列可以和同一個交換機綁定,同時多個交換機也可以和同一個隊列綁定。(多對多的關系)

A,類型。有三種類型:

1. Fanout Exchange (不處理路由鍵):一個發送到交換機上的消息都會被轉發到與該交換機綁定的所有隊列上。 Fanout 交換機發消息是最快的。

2. Direct Exchange (處理路由鍵):如果一個隊列綁定到該交換機上,并且當前要求路由鍵為 X ,只有路由鍵是 X 的消息才會被這個隊列轉發。

3. Topic Exchange (將路由鍵和某模式進行匹配,可以理解成模糊處理):路由鍵的詞由 “.” 隔開,符號 “#” 表示匹配 0 個或多個詞,符號 “*” 表示匹配不多不少一個詞。

類型總結:Fanout類型最簡單,這種模型忽略routingkey;Direct類型是使用最多的,使用確定的routingkey。這種模型下,接收消息時綁定’key_1′則只接收key_1的消息;最后一種是Topic,這種模式與Direct類似,但是支持通配符進行匹配,比如: ‘key_*’,就會接受key_1和key_2。Topic貌似美好,但是有可能導致不嚴謹,所以還是推薦使用Direct。

B,持久化。指定了持久化的交換機,在重新啟動時才能重建,否則需要客戶端重新聲明生成才行。

需要特別明確的概念:交換機的持久化,并不等于消息的持久化。只有在持久化隊列中的消息,才能持久化;如果沒有隊列,消息是沒有地方存儲的;消息本身在投遞時也有一個持久化標志的,PHP中默認投遞到持久化交換機就是持久的消息,不用特別指定。

4,queue: 隊列

講了這么多,才講到隊列呀。事實上,隊列僅是針對接收方(consumer)的,由接收方根據需求創建的。只有隊列創建了,交換機才會將新接受到的消息送到隊列中,交換機是不會在隊列創建之前的消息放進來的。換句話說,在建立隊列之前,發出的所有消息都被丟棄了。下面這個圖比RabbitMQ官方的圖更清楚——Queue是屬于ReceiveMessage的一部分。

接下來看一下創建隊列及接收消息的示例:

$e_name = 'e_linvo'; //交換機名$q_name = 'q_linvo'; //隊列名$k_route = ''; //路由key //創建連接和channel$conn = new AMQPConnection($conn_args);if (!$conn->connect()) {     die("Cannot connect to the broker!/n"); } $channel = new AMQPChannel($conn);   //創建交換機 $ex = new AMQPExchange($channel);$ex->setName($e_name);$ex->setType(AMQP_EX_TYPE_DIRECT); //direct類型$ex->setFlags(AMQP_DURABLE); //持久化echo "Exchange Status:".$ex->declare()."/n";   //創建隊列$q = new AMQPQueue($channel);$q->setName($q_name);$q->setFlags(AMQP_DURABLE); //持久化  //綁定交換機與隊列,并指定路由鍵echo 'Queue Bind: '.$q->bind($e_name, $k_route)."/n"; //阻塞模式接收消息echo "Message:/n";$q->consume('processMessage', AMQP_AUTOACK); //自動ACK應答  $conn->disconnect();/** * 消費回調函數 * 處理消息 */function processMessage($envelope, $queue) {    var_dump($envelope->getRoutingKey);    $msg = $envelope->getBody();    echo $msg."/n"; //處理消息}

從上述示例中可以看到,交換機既可以由消息發送端創建,也可以由消息消費者創建。

創建一個隊列(line:20)后,需要將隊列綁定到交換機上(line:25)隊列才能工作,routingkey也是在這里指定的。有的資料上寫成bindingkey,其實一回事兒,弄兩個名詞反倒容易混淆。

消息的處理,是有兩種方式:

A,一次性。用 $q->get([...]),不管取到取不到消息都會立即返回,一般情況下使用輪詢處理消息隊列就要用這種方式;

B,阻塞。用 $q->consum( callback, [...] ) 程序會進入持續偵聽狀態,每收到一個消息就會調用callback指定的函數一次,直到某個callback函數返回FALSE才結束。

關于callback,這里多說幾句: PHP的call_back是支持使用數組的,比如: $c = new MyClass(); $c->counter = 100; $q->consume( array($c,’myfunc’) ) 這樣就可以調用自己寫的處理類。MyClass中myfunc的參數定義,與上例中processMessage一樣就行。

在上述示例中,使用的$routingkey = ”, 意味著接收全部的消息。我們可以將其改為 $routingkey = ‘key_1′,可以看到結果中僅有設置routingkey為key_1的內容了。

注意: routingkey = ‘key_1′ 與 routingkey = ‘key_2′ 是兩個不同的隊列。假設: client1 與 client2 都連接到 key_1 的隊列上,一個消息被client1處理之后,就不會被client2處理。而 routingkey = ” 是另類,client_all綁定到 ” 上,將消息全都處理后,client1和client2上也就沒有消息了。

在程序設計上,需要規劃好exchange的名稱,以及如何使用key區分開不同類型的標記,在消息產生的地方插入發送消息代碼。后端處理,可以針對每一個key啟動一個或多個client,以提高消息處理的實時性。如何使用PHP進行多線程的消息處理,將在下一節中講述。

安裝erlang依賴的基本環境
#操作系統:CentOS release 6.2yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel java-devel  unixODBC-devel;
Erlang安裝方式一:源碼編譯

訪問 網址下載頁

wget http://www.erlang.org/download/otp_src_R16B03.tar.gz;tar -zxvf otp_src_R16B03.tar.gz;cd otp_src_R16B03;./configure --prefix=/usr/local/erlang --with-ssl -enable-threads -enable-smmp-support -enable-kernel-poll --enable-hipe --without-javac;#不用java編譯,故去掉java避免錯誤make && make install;
配置erlang環境
#vi /etc/profile在文件最后加入:PATH=$PATH:/usr/local/erlang/binexport PATH#source /etc/profile
Erlang安裝方式二:YUM安裝安裝erlang的YUM源

訪問 網址YUM安裝教程

#自動安裝erlang的YUM源wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpmrpm -Uvh erlang-solutions-1.0-1.noarch.rpm#或手動安裝YUM源rpm --import http://packages.erlang-solutions.com/rpm/erlang_solutions.ascAdd the following lines to some file in /etc/yum.repos.d/:[erlang-solutions]name=Centos $releasever - $basearch - Erlang Solutionsbaseurl=http://packages.erlang-solutions.com/rpm/centos/$releasever/$basearchgpgcheck=1gpgkey=http://packages.erlang-solutions.com/rpm/erlang_solutions.ascenabled=1
yum erlang
yum -y install erlang;
安裝成功檢測

安裝完后輸入“erl”以下提示即為安裝成功:

[root@localhost ~]# erlErlang/OTP 18 [erts-7.2] [source-e6dd627] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]Eshell V7.2  (abort with ^G)

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产欧美在线成人app| 国产精品久久久久久久久久免费| 北条麻妃在线一区二区| 欧美影院在线播放| 97婷婷大伊香蕉精品视频| 国产伦精品免费视频| 国产精品久久久一区| 日本中文字幕久久看| 韩国美女主播一区| 欧美精品在线免费播放| 久久精品91久久久久久再现| 日韩中文字幕免费看| 日韩第一页在线| 欧美激情一级二级| 国产69久久精品成人| 国产精品扒开腿做爽爽爽男男| 国产98色在线| 国产精品99蜜臀久久不卡二区| 日韩美女写真福利在线观看| 国产成人久久久| 中文字幕欧美亚洲| 欧美丰满老妇厨房牲生活| 成人中文字幕在线观看| 91精品国产高清久久久久久| 欧美国产日韩一区二区| 91精品美女在线| 久久精品成人一区二区三区| yw.139尤物在线精品视频| 国产精品video| 国产一区玩具在线观看| 亚洲第一页中文字幕| 青青a在线精品免费观看| 久久综合久久88| 国产精品一区=区| 亚洲国产女人aaa毛片在线| 国模吧一区二区三区| 97国产精品免费视频| 亚洲第一二三四五区| 538国产精品一区二区免费视频| 国产精品爱久久久久久久| 国内精品一区二区三区| 在线观看国产欧美| 久久男人av资源网站| 国产亚洲视频在线观看| 久久精品中文字幕一区| 久久视频中文字幕| 美女撒尿一区二区三区| www.亚洲天堂| 国产精品揄拍一区二区| 色婷婷综合久久久久中文字幕1| 国产精品高清网站| 亚洲女同性videos| 26uuu久久噜噜噜噜| 欧美亚洲成人xxx| 欧美激情国产精品| 日韩免费观看高清| 亚洲第一国产精品| 精品亚洲一区二区三区在线观看| 成人免费观看网址| 国产精品夜色7777狼人| 成人性生交大片免费观看嘿嘿视频| 久久精品精品电影网| 亚洲一区二区免费在线| 日韩精品极品毛片系列视频| 成人黄色中文字幕| 国模精品视频一区二区三区| 国产一区二区黑人欧美xxxx| 日韩视频一区在线| 麻豆国产精品va在线观看不卡| 精品无码久久久久久国产| 91精品视频在线免费观看| 国产精品麻豆va在线播放| 日韩精品福利在线| 国产精品成人v| 亚洲欧洲在线播放| 欧美视频不卡中文| 一色桃子一区二区| 亚洲一区二区三区视频播放| 国内精品小视频| 国产精品久久久久7777婷婷| 亚洲色图校园春色| 国产精品一区二区久久| 国产精品免费一区豆花| 亚洲国产成人av在线| 欧美成人精品三级在线观看| 精品久久久久久中文字幕大豆网| 国产视频精品一区二区三区| 国产精品成人av在线| 亚洲国产成人精品女人久久久| 欧美精品一区三区| 亚洲国产小视频| 久热99视频在线观看| 伊人成人开心激情综合网| 国产精品草莓在线免费观看| 国产丝袜精品第一页| 精品女同一区二区三区在线播放| 国产精品一二三在线| 深夜福利一区二区| 91久久精品国产91性色| 最近2019中文字幕第三页视频| 91精品成人久久| 亚洲人成在线观看网站高清| 九九视频直播综合网| 日韩电影在线观看中文字幕| 色噜噜亚洲精品中文字幕| 欧美午夜视频在线观看| 成人在线视频网| 亚洲伊人成综合成人网| 久久免费在线观看| 国产一区二中文字幕在线看| 欧美有码在线观看| 在线午夜精品自拍| 亚洲国产精久久久久久| 久久99国产精品自在自在app| 国产精品极品美女粉嫩高清在线| 国产成人免费av| 欧美日韩精品在线视频| 欧美电影在线免费观看网站| 久久99久久亚洲国产| 日韩国产高清污视频在线观看| 亚洲自拍小视频免费观看| 亚洲成人激情视频| 欧美二区乱c黑人| 久久精品国产一区二区三区| 91最新国产视频| 91精品国产综合久久香蕉的用户体验| 国产成人一区二区三区电影| 日韩免费看的电影电视剧大全| 成人亲热视频网站| 日本欧美一二三区| 亚洲第一精品夜夜躁人人躁| 日本sm极度另类视频| 亚洲色图35p| 中文字幕亚洲无线码a| 欧美大片免费观看| 久久人人爽人人爽人人片av高清| 日韩欧美国产视频| 亚洲视频精品在线| 亚洲国产精品热久久| 亚洲欧美日韩国产中文专区| 日韩欧美在线网址| 亚洲最大的成人网| 国产精品96久久久久久又黄又硬| 欧美在线视频在线播放完整版免费观看| 国产精品自拍小视频| 日本一本a高清免费不卡| 68精品久久久久久欧美| 久久这里有精品视频| 国产精品久久久久久久久久尿| 欧美激情国产精品| 亚洲精品在线看| 国产精品亚洲视频在线观看| 91精品国产高清久久久久久久久| 久久精品成人欧美大片| 欧美一级成年大片在线观看| 色综合久综合久久综合久鬼88| 国产成人一区二区三区| 九九热r在线视频精品| 日韩电影免费观看在线观看| 亚洲第一在线视频| 性色av一区二区三区红粉影视| 2019中文字幕免费视频| 热久久免费视频精品| 日韩国产激情在线|