成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

RabbitMQ+PHP 教程一(Hello World)

silencezwm / 1203人閱讀

摘要:在中間的框是一個隊列的消息緩沖區(qū),保持代表的消費。本教程介紹,這是一個開放的通用的協(xié)議消息。我們將在本教程中使用,解決依賴管理。發(fā)送者將連接到,發(fā)送一條消息,然后退出。注意,這與發(fā)送發(fā)布的隊列匹配。

介紹

RabbitMQ是一個消息代理器:它接受和轉(zhuǎn)發(fā)消息。你可以把它當(dāng)作一個郵局:當(dāng)你把郵件放在信箱里時,你可以肯定郵差先生最終會把郵件送到你的收件人那里。在這個比喻中,RabbitMQ就是這里的郵箱,郵局和郵差。

RabbitMQ和郵局之間的主要區(qū)別是,它不處理紙張,而是接受、存儲和轉(zhuǎn)發(fā)二進(jìn)制數(shù)據(jù)?消息。

RabbitMQ,和一般的消息傳遞,使用專業(yè)術(shù)語。

生產(chǎn)者的工作就是發(fā)送消息。發(fā)送消息的程序是生產(chǎn)者:

隊列類比一個郵箱,存在于RabbitMQ, 然而信息流通過RabbitMQ和您的應(yīng)用程序,他們只能存儲在一個隊列。隊列只受主機內(nèi)存和磁盤限制的約束,它本質(zhì)上是一個很大的消息緩沖區(qū)。會有許多生產(chǎn)者可以發(fā)送到一個隊列的消息,許多消費者可以嘗試從一個隊列接收數(shù)據(jù)。這就是我們?nèi)绾伪硎娟犃械姆绞剑?/p>

消費者和生產(chǎn)者有著相似的意義. 消費者無非就是等待消息然后處理的程序:

請注意,生產(chǎn)者、消費者和代理不必同一主機上;事實上,在大多數(shù)應(yīng)用程序中它們沒有這樣做。

"Hello World"

(使用PHP amqplib客戶端)

在本教程的這一部分中,我們將用PHP編寫兩個程序;一個生產(chǎn)者發(fā)送一條消息,一個用戶接收消息并將它們打印出來。我們會PHP amqplib API的忽略一些細(xì)節(jié),集中在這個非常簡單的事情剛剛開始。這是一個“Hello World”的消息傳遞。

在下圖中,“p”是我們的生產(chǎn)商,“C”是我們的消費者。在中間的框是一個隊列的消息緩沖區(qū),RabbitMQ保持代表的消費。

PHP amqplib客戶端庫

RabbitMQ有很多協(xié)議。本教程介紹AMQP 0-9-1,這是一個開放的、通用的協(xié)議消息。有許多不同的語言RabbitMQ一批客戶。我們將在本教程中使用PHP amqplib,composer解決依賴管理。

添加composer.json:

{
    "require": {
        "php-amqplib/php-amqplib": ">=2.6.1"
    }
}
composer install

# 或者 直接運行包引入
composer require php-amqplib/php-amqplib
現(xiàn)在我們可以開始我們的hello world

生產(chǎn)者(消息發(fā)送方)

我們命令我們的消息發(fā)布者(發(fā)送者)send.php和消息接收receive.php。發(fā)送者將連接到RabbitMQ,發(fā)送一條消息,然后退出。

require_once __DIR__ . "/vendor/autoload.php";
use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

現(xiàn)在我們能創(chuàng)建一個連接服務(wù)器的Connection:

$connection = new AMQPStreamConnection("localhost", 5672, "guest", "guest");
$channel = $connection->channel();

該連接抽象套接字(socket)連接,并為我們負(fù)責(zé)協(xié)議版本協(xié)商和認(rèn)證等。這里,我們連接到一個rabbitmq代理器在本地機器上-使用localhost。如果我們想在不同的機器上連接到一個代理,我們只需在這里指定它的名稱或IP地址。

接下來,我們創(chuàng)建一個通道,這是處理事情的大部分API的地方。

發(fā)送消息前,我們必須聲明一個隊列為我們發(fā)送做準(zhǔn)備;然后我們可以向隊列發(fā)布消息:

$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不知道是什么意思) - 只有在它不存在時才會創(chuàng)建隊列。消息內(nèi)容是一個字節(jié)數(shù)組,因此您可以在那里編碼用你喜歡的方式。

最后,我們關(guān)閉通道和連接;

$channel->close();
$connection->close();

上面我們完成了send.php.

接下來我們完成消費方的代碼

消費者(接收方,任務(wù)處理方)

消費者從RabbitMQ接收推來的消息,我們會保持運行監(jiān)聽消息并打印出來。

引入lib

require_once __DIR__ . "/vendor/autoload.php";
use PhpAmqpLibConnectionAMQPStreamConnection;

設(shè)置與發(fā)布程序相同;我們打開一個連接和一個通道,并聲明將要消耗的隊列。注意,這與發(fā)送發(fā)布的隊列匹配。

$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", "
";

注意,我們也在這里聲明隊列。因為我們可能在發(fā)布之前啟動消費者,我們希望在我們嘗試從它那里消費消息之前確定隊列的存在。

我們將告訴服務(wù)器從隊列中發(fā)送消息。我們將定義一個PHP可調(diào)用,它將接收服務(wù)器發(fā)送的消息。請記住,消息是從服務(wù)器異步發(fā)送到客戶機的。

$callback = function($msg) {
  echo " [x] Received ", $msg->body, "
";
};

$channel->basic_consume("hello", "", false, true, false, false, $callback);

while(count($channel->callbacks)) {
    $channel->wait();
}

當(dāng)調(diào)用basic_consume,我們的代碼會阻塞。當(dāng)我們收到消息時,我們的回調(diào)函數(shù)將通過接收到返回的消息傳遞。

以上是我們receive.php的代碼

運行測試 運行消費者
php receive.php
運行消息發(fā)送方
php send.php
列出隊列
rabbitmqctl list_queues
完整源碼(調(diào)整過) 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();

//發(fā)送方其實不需要設(shè)置隊列, 不過對于持久化有關(guān),建議執(zhí)行該行
$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();
?>

了解如何構(gòu)建一個簡單的工作隊列, 你可以閱讀下一章節(jié): RabbitMQ+PHP 教程二(Work Queues)

翻譯來自 RabbitMQ - RabbitMQ tutorial - "Hello World!"

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26025.html

相關(guān)文章

  • RabbitMQ 基礎(chǔ)教程(1) - Hello World

    摘要:基礎(chǔ)教程注本文是對眾多博客的學(xué)習(xí)和總結(jié),可能存在理解錯誤。請帶著懷疑的眼光,同時如果有錯誤希望能指出。安裝庫這里我們首先將消息推入隊列,然后消費者從隊列中去除消息進(jìn)行消費。 RabbitMQ 基礎(chǔ)教程(1) - Hello World 注:本文是對眾多博客的學(xué)習(xí)和總結(jié),可能存在理解錯誤。請帶著懷疑的眼光,同時如果有錯誤希望能指出。 如果你喜歡我的文章,可以關(guān)注我的私人博客:http:...

    wushuiyong 評論0 收藏0
  • RabbitMQ+PHP 教程二(Work Queues)

    摘要:平均每個消費者將得到相同數(shù)量的消息。消息確認(rèn)完成任務(wù)可能需要幾秒鐘。為了確保消息不會丟失,支持消息確認(rèn)。沒有任何消息超時當(dāng)這個消費者中止了,將會重新分配消息時。這是因為只是調(diào)度消息時,消息進(jìn)入隊列。 showImg(https://segmentfault.com/img/bVXNuN?w=332&h=111); 介紹 在上一個 Hello World 教程中,我們編寫了從指定隊列發(fā)送...

    iKcamp 評論0 收藏0
  • RabbitMQ使用教程RabbitMQ環(huán)境安裝配置及Hello World示例

    摘要:進(jìn)行插入操作的端稱為隊尾,進(jìn)行刪除操作的端稱為對頭。還有個專業(yè)術(shù)語要了解下生產(chǎn)者發(fā)送消息的應(yīng)用程序被稱為生產(chǎn)者。消費者接收消息的應(yīng)用程序被稱為消費者。參考鏈接下安裝及操作常用命令譯實戰(zhàn)教程一你是否聽說過或者使用過隊列? 你是否聽說過或者使用過消息隊列? 你是否聽說過或者使用過RabbitMQ? 提到這幾個詞,用過的人,也許覺得很簡單,沒用過的人,也許覺得很復(fù)雜,至少在我沒使用消息隊列之前,聽...

    SegmentFault 評論0 收藏0
  • rabbitmq中文教程python版 - 介紹

    摘要:每當(dāng)我們收到一條消息,這個回調(diào)函數(shù)就被皮卡庫調(diào)用。接下來,我們需要告訴這個特定的回調(diào)函數(shù)應(yīng)該從我們的隊列接收消息為了讓這個命令成功,我們必須確保我們想要訂閱的隊列存在。生產(chǎn)者計劃將在每次運行后停止歡呼我們能夠通過發(fā)送我們的第一條消息。 源碼:https://github.com/ltoddy/rabbitmq-tutorial 介紹 RabbitMQ是一個消息代理:它接受和轉(zhuǎn)發(fā)消息。你...

    yimo 評論0 收藏0
  • rabbitmq中文教程python版 - 工作隊列

    摘要:我們將任務(wù)封裝為消息并將其發(fā)送到隊列。為了確保消息永不丟失,支持消息確認(rèn)。沒有任何消息超時當(dāng)消費者死亡時,將重新傳遞消息。發(fā)生這種情況是因為只在消息進(jìn)入隊列時調(diào)度消息。這告訴一次不要向工作人員發(fā)送多個消息。 源碼:https://github.com/ltoddy/rabbitmq-tutorial 工作隊列 showImg(https://segmentfault.com/img/r...

    tabalt 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<