摘要:在中間的框是一個隊列的消息緩沖區,保持代表的消費。本教程介紹,這是一個開放的通用的協議消息。我們將在本教程中使用,解決依賴管理。發送者將連接到,發送一條消息,然后退出。注意,這與發送發布的隊列匹配。
介紹
RabbitMQ是一個消息代理器:它接受和轉發消息。你可以把它當作一個郵局:當你把郵件放在信箱里時,你可以肯定郵差先生最終會把郵件送到你的收件人那里。在這個比喻中,RabbitMQ就是這里的郵箱,郵局和郵差。
RabbitMQ和郵局之間的主要區別是,它不處理紙張,而是接受、存儲和轉發二進制數據?消息。
RabbitMQ,和一般的消息傳遞,使用專業術語。
生產者的工作就是發送消息。發送消息的程序是生產者:
隊列類比一個郵箱,存在于RabbitMQ, 然而信息流通過RabbitMQ和您的應用程序,他們只能存儲在一個隊列。隊列只受主機內存和磁盤限制的約束,它本質上是一個很大的消息緩沖區。會有許多生產者可以發送到一個隊列的消息,許多消費者可以嘗試從一個隊列接收數據。這就是我們如何表示隊列的方式:
消費者和生產者有著相似的意義. 消費者無非就是等待消息然后處理的程序:
請注意,生產者、消費者和代理不必同一主機上;事實上,在大多數應用程序中它們沒有這樣做。
"Hello World"(使用PHP amqplib客戶端)
在本教程的這一部分中,我們將用PHP編寫兩個程序;一個生產者發送一條消息,一個用戶接收消息并將它們打印出來。我們會PHP amqplib API的忽略一些細節,集中在這個非常簡單的事情剛剛開始。這是一個“Hello World”的消息傳遞。
在下圖中,“p”是我們的生產商,“C”是我們的消費者。在中間的框是一個隊列的消息緩沖區,RabbitMQ保持代表的消費。
PHP amqplib客戶端庫RabbitMQ有很多協議。本教程介紹AMQP 0-9-1,這是一個開放的、通用的協議消息。有許多不同的語言RabbitMQ一批客戶。我們將在本教程中使用PHP amqplib,composer解決依賴管理。
添加composer.json:
{ "require": { "php-amqplib/php-amqplib": ">=2.6.1" } }
composer install # 或者 直接運行包引入 composer require php-amqplib/php-amqplib現在我們可以開始我們的hello world
生產者(消息發送方)
我們命令我們的消息發布者(發送者)send.php和消息接收receive.php。發送者將連接到RabbitMQ,發送一條消息,然后退出。
require_once __DIR__ . "/vendor/autoload.php"; use PhpAmqpLibConnectionAMQPStreamConnection; use PhpAmqpLibMessageAMQPMessage;
現在我們能創建一個連接服務器的Connection:
$connection = new AMQPStreamConnection("localhost", 5672, "guest", "guest"); $channel = $connection->channel();
該連接抽象套接字(socket)連接,并為我們負責協議版本協商和認證等。這里,我們連接到一個rabbitmq代理器在本地機器上-使用localhost。如果我們想在不同的機器上連接到一個代理,我們只需在這里指定它的名稱或IP地址。
接下來,我們創建一個通道,這是處理事情的大部分API的地方。
發送消息前,我們必須聲明一個隊列為我們發送做準備;然后我們可以向隊列發布消息:
$channel->queue_declare("hello", false, false, false, false); $msg = new AMQPMessage("Hello World!"); $channel->basic_publish($msg, "", "hello"); echo " [x] Sent "Hello World!" ";
聲明隊列是冪等的(原句:Declaring a queue is idempotent,這里的idempotent不知道是什么意思) - 只有在它不存在時才會創建隊列。消息內容是一個字節數組,因此您可以在那里編碼用你喜歡的方式。
最后,我們關閉通道和連接;
$channel->close(); $connection->close();
上面我們完成了send.php.
接下來我們完成消費方的代碼
消費者(接收方,任務處理方)消費者從RabbitMQ接收推來的消息,我們會保持運行監聽消息并打印出來。
引入lib
require_once __DIR__ . "/vendor/autoload.php"; use PhpAmqpLibConnectionAMQPStreamConnection;
設置與發布程序相同;我們打開一個連接和一個通道,并聲明將要消耗的隊列。注意,這與發送發布的隊列匹配。
$connection = new AMQPStreamConnection("localhost", 5672, "guest", "guest"); $channel = $connection->channel(); $channel->queue_declare("hello", false, false, false, false); echo " [*] Waiting for messages. To exit press CTRL+C", " ";
注意,我們也在這里聲明隊列。因為我們可能在發布之前啟動消費者,我們希望在我們嘗試從它那里消費消息之前確定隊列的存在。
我們將告訴服務器從隊列中發送消息。我們將定義一個PHP可調用,它將接收服務器發送的消息。請記住,消息是從服務器異步發送到客戶機的。
$callback = function($msg) { echo " [x] Received ", $msg->body, " "; }; $channel->basic_consume("hello", "", false, true, false, false, $callback); while(count($channel->callbacks)) { $channel->wait(); }
當調用basic_consume,我們的代碼會阻塞。當我們收到消息時,我們的回調函數將通過接收到返回的消息傳遞。
以上是我們receive.php的代碼
運行測試 運行消費者php receive.php運行消息發送方
php send.php列出隊列
rabbitmqctl list_queues完整源碼(調整過) config.php
[ "path" => dirname(dirname(__DIR__)) . "/vendor" ], "rabbitmq" => [ "host" => "127.0.0.1", "port" => "5672", "login" => "qkl", "password" => "123456", "vhost" => "/" ] ]; ?>receive.php
channel(); $channel->queue_declare("hello", false, false, false, false); echo " [*] Waiting for messages. To exit press CTRL+C", " "; $callback = function($msg) { echo " [x] Received ", $msg->body, " "; }; $channel->basic_consume("hello", "", false, true, false, false, $callback); while(count($channel->callbacks)) { $channel->wait(); } $channel->close(); $connection->close(); ?>send.php
channel(); //發送方其實不需要設置隊列, 不過對于持久化有關,建議執行該行 $channel->queue_declare("hello", false, false, false, false); $msg = new AMQPMessage("Hello World!"); $channel->basic_publish($msg, "", "hello"); echo " [x] Sent "Hello World!" "; $channel->close(); $connection->close(); ?>
了解如何構建一個簡單的工作隊列, 你可以閱讀下一章節: RabbitMQ+PHP 教程二(Work Queues)
翻譯來自 RabbitMQ - RabbitMQ tutorial - "Hello World!"
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26025.html
摘要:基礎教程注本文是對眾多博客的學習和總結,可能存在理解錯誤。請帶著懷疑的眼光,同時如果有錯誤希望能指出。安裝庫這里我們首先將消息推入隊列,然后消費者從隊列中去除消息進行消費。 RabbitMQ 基礎教程(1) - Hello World 注:本文是對眾多博客的學習和總結,可能存在理解錯誤。請帶著懷疑的眼光,同時如果有錯誤希望能指出。 如果你喜歡我的文章,可以關注我的私人博客:http:...
摘要:平均每個消費者將得到相同數量的消息。消息確認完成任務可能需要幾秒鐘。為了確保消息不會丟失,支持消息確認。沒有任何消息超時當這個消費者中止了,將會重新分配消息時。這是因為只是調度消息時,消息進入隊列。 showImg(https://segmentfault.com/img/bVXNuN?w=332&h=111); 介紹 在上一個 Hello World 教程中,我們編寫了從指定隊列發送...
摘要:進行插入操作的端稱為隊尾,進行刪除操作的端稱為對頭。還有個專業術語要了解下生產者發送消息的應用程序被稱為生產者。消費者接收消息的應用程序被稱為消費者。參考鏈接下安裝及操作常用命令譯實戰教程一你是否聽說過或者使用過隊列? 你是否聽說過或者使用過消息隊列? 你是否聽說過或者使用過RabbitMQ? 提到這幾個詞,用過的人,也許覺得很簡單,沒用過的人,也許覺得很復雜,至少在我沒使用消息隊列之前,聽...
摘要:每當我們收到一條消息,這個回調函數就被皮卡庫調用。接下來,我們需要告訴這個特定的回調函數應該從我們的隊列接收消息為了讓這個命令成功,我們必須確保我們想要訂閱的隊列存在。生產者計劃將在每次運行后停止歡呼我們能夠通過發送我們的第一條消息。 源碼:https://github.com/ltoddy/rabbitmq-tutorial 介紹 RabbitMQ是一個消息代理:它接受和轉發消息。你...
摘要:我們將任務封裝為消息并將其發送到隊列。為了確保消息永不丟失,支持消息確認。沒有任何消息超時當消費者死亡時,將重新傳遞消息。發生這種情況是因為只在消息進入隊列時調度消息。這告訴一次不要向工作人員發送多個消息。 源碼:https://github.com/ltoddy/rabbitmq-tutorial 工作隊列 showImg(https://segmentfault.com/img/r...
閱讀 1118·2021-11-25 09:43
閱讀 1639·2021-09-13 10:25
閱讀 2592·2021-09-09 11:38
閱讀 3400·2021-09-07 10:14
閱讀 1714·2019-08-30 15:52
閱讀 641·2019-08-30 15:44
閱讀 3572·2019-08-29 13:23
閱讀 1974·2019-08-26 13:33