介紹
RabbitMQ是一個(gè)消息代理器:它接受和轉(zhuǎn)發(fā)消息蔬墩。你可以把它當(dāng)作一個(gè)郵局:當(dāng)你把郵件放在信箱里時(shí)为肮,你可以肯定郵差先生最終會(huì)把郵件送到你的收件人那里改淑。在這個(gè)比喻中园骆,RabbitMQ就是這里的郵箱师逸,郵局和郵差壁袄。
"Hello World"
在本教程的這一部分中类早,我們將用PHP編寫兩個(gè)程序;一個(gè)生產(chǎn)者發(fā)送一條消息嗜逻,一個(gè)用戶接收消息并將它們打印出來涩僻。我們會(huì)PHP amqplib API的忽略一些細(xì)節(jié),集中在這個(gè)非常簡(jiǎn)單的事情剛剛開始栈顷。這是一個(gè)“Hello World”的消息傳遞逆日。
在下圖中,“p”是我們的生產(chǎn)商萄凤,“C”是我們的消費(fèi)者室抽。在中間的框是一個(gè)隊(duì)列的消息緩沖區(qū),RabbitMQ保持代表的消費(fèi)靡努。
PHP amqplib客戶端庫(kù)[當(dāng)然你也可以使用 PHP 官方的 amqp 擴(kuò)展]
添加composer.json:
{
"name": "molei/rabbit-mq",
"require": {
"php-amqplib/php-amqplib": ">=2.6.1"
}
,"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
}
}
}
生產(chǎn)者(消息發(fā)送方)
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
現(xiàn)在我們能創(chuàng)建一個(gè)連接服務(wù)器的Connection:
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
然后我們像隊(duì)列中發(fā)送一個(gè)消息對(duì)象
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg,'','hello');
//websocket
echo " [x] Sent 'Hello World!'\n";
最后坪圾,我們關(guān)閉通道和連接;
$channel->close();
$connection->close();
上面我們完成了send.php.
接下來我們完成任務(wù)處理方的代碼
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
RabbitMQ是可以支持異步處理的颤难。
我這里使用的是一個(gè)異步處理的實(shí)現(xiàn)方法
$callback = function($msg) {
echo " [x] Received ", $msg->body, "\n";
};
$channel->basic_consume('hello', '', false, true, false, false, $callback);
while(count($channel->callbacks)) {
$channel->wait();
}
看到這里大家應(yīng)該明白怎么使用RabbitMQ去做一下異步的工作了吧神年!
你只要發(fā)布消息后,在對(duì)應(yīng)的事件寫處理的回調(diào)就可以了行嗤。注意 必須一樣的名稱已日,必然我們發(fā)布者使用的hello。那消費(fèi)者也必須使用hello來做響應(yīng)栅屏,這個(gè)有點(diǎn)像Socket.io的一個(gè)原理飘千。
這個(gè)和laravel的隊(duì)列使用區(qū)里市差不多的堂鲜,這部格RabbitMQ的隊(duì)列可以做到更高的管理。不過使用RabbitMQ的話护奈,你可以和更多的系統(tǒng)一起協(xié)同工作缔莲。RPC一種低成本攜程模式。