PHP初次使用rabbitMQ

消息隊(duì)列

此處使用window環(huán)境,Linux環(huán)境下,添加

rabbitMQ是什么 傳送門在此

資源URL

PHP的rabbitMQ擴(kuò)展
rabbitMQ官網(wǎng)
rabbitMQ官網(wǎng)下載地址
erlang官網(wǎng)
erlang下載


概念

幾個(gè)概念說(shuō)明:
Broker:簡(jiǎn)單來(lái)說(shuō)就是消息隊(duì)列服務(wù)器實(shí)體划滋。

  • Exchange:消息交換機(jī)荐吵,它指定消息按什么規(guī)則仔蝌,路由到哪個(gè)隊(duì)列。
  • Queue:消息隊(duì)列載體土居,每個(gè)消息都會(huì)被投入到一個(gè)或多個(gè)隊(duì)列。
  • Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來(lái)为黎。
  • Routing Key:路由關(guān)鍵字,exchange根據(jù)這個(gè)關(guān)鍵字進(jìn)行消息投遞行您。
  • vhost:虛擬主機(jī)铭乾,一個(gè)broker里可以開(kāi)設(shè)多個(gè)vhost,用作不同用戶的權(quán)限分離娃循。
  • producer:消息生產(chǎn)者炕檩,就是投遞消息的程序。
  • consumer:消息消費(fèi)者捌斧,就是接受消息的程序笛质。
  • channel:消息通道,在客戶端的每個(gè)連接里捞蚂,可建立多個(gè)channel经瓷,每個(gè)channel代表一個(gè)會(huì)話任務(wù)。
    消息隊(duì)列的使用過(guò)程大概如下:
    (1)客戶端連接到消息隊(duì)列服務(wù)器洞难,打開(kāi)一個(gè)channel舆吮。
    (2)客戶端聲明一個(gè)exchange,并設(shè)置相關(guān)屬性队贱。
    (3)客戶端聲明一個(gè)queue色冀,并設(shè)置相關(guān)屬性。
    (4)客戶端使用routing key柱嫌,在exchange和queue之間建立好綁定關(guān)系锋恬。
    (5)客戶端投遞消息到exchange。
    exchange接收到消息后编丘,就根據(jù)消息的key和已經(jīng)設(shè)置的binding与学,進(jìn)行消息路由,將消息投遞到一個(gè)或多個(gè)隊(duì)列里嘉抓。
    exchange也有幾個(gè)類型索守,完全根據(jù)key進(jìn)行投遞的叫做Direct交換機(jī),例如抑片,綁定時(shí)設(shè)置了routing key為”abc”卵佛,那么客戶端提交的消息,只有設(shè)置了key為”abc”的才會(huì)投遞到隊(duì)列。對(duì)key進(jìn)行模式匹配后進(jìn)行投遞的叫做Topic交換機(jī)截汪,符號(hào)”#”匹配一個(gè)或多個(gè)詞疾牲,符號(hào)””匹配正好一個(gè)詞。例如”abc.#”匹配”abc.def.ghi”衙解,”abc.”只匹配”abc.def”阳柔。還有一種不需要key的,叫做Fanout交換機(jī)蚓峦,它采取廣播模式盔沫,一個(gè)消息進(jìn)來(lái)時(shí),投遞到與該交換機(jī)綁定的所有隊(duì)列枫匾。
    RabbitMQ支持消息的持久化架诞,也就是數(shù)據(jù)寫在磁盤上,為了數(shù)據(jù)安全考慮干茉,我想大多數(shù)用戶都會(huì)選擇持久化谴忧。消息隊(duì)列持久化包括3個(gè)部分:
      (1)exchange持久化角虫,在聲明時(shí)指定durable => 1
     ≌次健(2)queue持久化,在聲明時(shí)指定durable => 1
     〈炼臁(3)消息持久化均驶,在投遞時(shí)指定delivery_mode => 2(1是非持久化)
    如果exchange和queue都是持久化的,那么它們之間的binding也是持久化的枫虏。如果exchange和queue兩者之間有一個(gè)持久化妇穴,一個(gè)非持久化,就不允許建立綁定隶债。

安裝環(huán)境

  1. 先安裝erlang包,然后添加環(huán)境變量 PATH erlang安裝路徑\bin
  2. 然后安裝rabbitMQ,然后添加環(huán)境變量 PATH rabbitMQ安裝路徑\sbin
  3. 以管理員身份進(jìn)入rabbitMQ安裝目錄/sbin依次執(zhí)行命令
  • rabbitmq-plugins.bat enable rabbitmq_management
  • rabbitmq-service.bat stop
  • rabbitmq-service.bat install
  • rabbitmq-service.bat start

執(zhí)行后,訪問(wèn)127.0.0.1:15672 查看rabbitMQ是否安裝成功, 登錄賬號(hào)密碼是 guest

  1. PHP環(huán)境搭建
  • 配置 php.ini extension=php_amqp.dll; 并將rabbitmq.*.dll 放到和php.ini的同級(jí)目錄下
  • 重啟php-fpm
  • 打印phpinfo() 查看amqp擴(kuò)展
    安裝END

customer.php

$conn_args = [
    'host' => '127.0.0.1',
    'port' => '5672',
    'login' => 'guest',
    'password' => 'guest',
    'vhost' => '/',
];

$exchangeName= 'exchange'; #交換機(jī)名
$queueName = 'queue'; #隊(duì)列名
$keyRoute = 'keyRoute'; #路由key
//創(chuàng)建鏈接
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
    die('連接失敗');
}
//創(chuàng)建頻道
$channel = new AMQPChannel($conn);
//創(chuàng)建交換機(jī)
$exchange = new AMQPExchange($channel);
$exchange->setName($exchangeName);  #交換機(jī)名
$exchange->setType(AMQP_EX_TYPE_DIRECT); #類型
$exchange->setFlags(AMQP_DURABLE); #持久化

echo "交換機(jī)狀態(tài):".$exchange->declareExchange()."\n";

//創(chuàng)建隊(duì)列
$queue = new AMQPQueue($channel);
$queue->setName($queueName);
$queue->setFlags(AMQP_DURABLE); #持久化
echo "消息總數(shù):".$queue->declareQueue()."\n";
//綁定交換機(jī)與隊(duì)列腾它,并指定路由鍵
$queue->bind($exchangeName, $keyRoute);
//阻塞模式接收消息
echo "Message:\n";
while(True){
    $queue->consume(function($envelope, $queue){
        $msg = $envelope->getBody();
        echo $msg."\n"; //處理消息
        $queue->ack($envelope->getDeliveryTag()); //手動(dòng)發(fā)送ACK應(yīng)答
    });
    //$queue->consume('processMessage', AMQP_AUTOACK); //自動(dòng)ACK應(yīng)答
}
$conn->disconnect();

publisher.php

$conn_args = array(
    'host' => '127.0.0.1',
    'port' => '5672',
    'login' => 'guest',
    'password' => 'guest',
    'vhost' => '/'
);
$exchangeName = 'exchange'; //交換機(jī)名
$keyRoute = 'keyRoute'; //路由key

//創(chuàng)建連接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
    die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);
date_default_timezone_set("Asia/Shanghai");

//創(chuàng)建交換機(jī)對(duì)象
$exchange = new AMQPExchange($channel);
$exchange->setName($exchangeName);
$exchange->setType(AMQP_DURABLE);
//發(fā)送消息
//$channel->startTransaction(); //開(kāi)始事務(wù)
for ($i = 0; $i < 5; ++$i) {
    sleep(1);//休眠1秒
    //消息內(nèi)容
    $message = "測(cè)試數(shù)據(jù)!" . date("H:i:s");
    echo "Send Message:" . $exchange->publish($message, $keyRoute) . "\n";
}
//$channel->commitTransaction(); //提交事務(wù)

$conn->disconnect();

命令行A下先執(zhí)行 php customer.php,然后新cmd下執(zhí)行 php publisher.php
命令行A將有輸出

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市死讹,隨后出現(xiàn)的幾起案子瞒滴,更是在濱河造成了極大的恐慌,老刑警劉巖赞警,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妓忍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡愧旦,警方通過(guò)查閱死者的電腦和手機(jī)世剖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)忘瓦,“玉大人搁廓,你說(shuō)我怎么就攤上這事「ぃ” “怎么了境蜕?”我有些...
    開(kāi)封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凌停。 經(jīng)常有香客問(wèn)我粱年,道長(zhǎng),這世上最難降的妖魔是什么罚拟? 我笑而不...
    開(kāi)封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任台诗,我火速辦了婚禮,結(jié)果婚禮上赐俗,老公的妹妹穿的比我還像新娘拉队。我一直安慰自己,他們只是感情好阻逮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布粱快。 她就那樣靜靜地躺著,像睡著了一般叔扼。 火紅的嫁衣襯著肌膚如雪事哭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天瓜富,我揣著相機(jī)與錄音鳍咱,去河邊找鬼。 笑死与柑,一個(gè)胖子當(dāng)著我的面吹牛谤辜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播价捧,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼每辟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了干旧?” 一聲冷哼從身側(cè)響起渠欺,我...
    開(kāi)封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椎眯,沒(méi)想到半個(gè)月后挠将,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡编整,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年舔稀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掌测。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡内贮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夜郁,我是刑警寧澤什燕,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站竞端,受9級(jí)特大地震影響屎即,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜事富,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一技俐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧统台,春花似錦雕擂、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至募寨,卻和暖如春族展,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拔鹰。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工仪缸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人列肢。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓恰画,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瓷马。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拴还,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350