你或許在思考數(shù)據(jù)分發(fā)浙值、無阻塞作業(yè)或者消息推送恳不。或者你想要進行發(fā)布/訂閱开呐,異步任務烟勋,工作隊列。所有的這些模式筐付,都是消息隊列的一部分卵惦。
1.安裝RabbmitMQ
wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.8/rabbitmq-server-3.6.8-1.el6.noarch.rpm
獲取rpm ,安裝的時候會發(fā)現(xiàn)缺少依賴
安裝依賴erlang
wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
yum install erlang
注意不要用epel的源直接yum安裝,epel源的erlang版本太低
安裝依賴socat
yum install socat
最后
rpm -Uvh rabbitmq-server-3.6.8-1.el6.noarch.rpm
2.php的RabbmitMQ庫
{
"require": {
"php-amqplib/php-amqplib": "2.6.*"
}
}
comoser install
3.php+RabbmitMQ helloworld
//send.php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello'); //發(fā)送一個消息到hello頻道
echo " [x] Sent 'Hello World!'\n";
$channel->close();
$connection->close();
//receive.php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$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', "\n";
$callback = function($msg) {
echo " [x] Received ", $msg->body, "\n";
};
//接收hello頻道的消息
$channel->basic_consume('hello', '', false, true, false, false, $callback);
while(count($channel->callbacks)) {
$channel->wait();
}
4.運行
首先運行起來rabbmitMQ server
service rabbmitmq-server start
掛起receive.php接收消息處理
php receive.php
發(fā)送消息
##另起一個窗口執(zhí)行
php send.php
以上代碼就構建了一個簡單的消息隊列
消息從send.php 生產(chǎn)(p) 進入隊列 交由 消費者(c)
注意:當關閉了命令行窗口receive.php 進程將會結(jié)束,這個時候就需要借助
supservisor 來將receive.php 腳本后臺運行。這部分代碼可以改寫應用作簡單的異步隊列任務的場景穴豫,但到了高并發(fā)高可用需求下就要進行額外的一些處理夸楣。在之后的文章中我會講到rabbmitMQ的競爭消費模式和superverisor的用法。