[rabbitMQ]四、rabbitMQ隊列之簡單模式(simple)

簡單的點對點消息模型。開啓mq服務,開啓進程P 生產者向mq 寫消息,進程C消費者監聽mq,消費消息。我們來簡單模擬一下。

一、原生rabbitmq

生產者(publish.php):

1.創建連接:

$config = array(
    'host' => '127.0.0.1',
    'port' => '5672',
    'login' => 'guest',
    'password' => '123456',
    'vhost'=>'/'
);

$e_name = 'exchange1'; //交換機名
$q_name = 'queue1'; //隊列名
$k_route = 'routekey'; //路由key

//創建連接和channel
$conn = new AMQPConnection($config);
if (!$conn->connect()) {
    die("Cannot connect to the broker!\n");
}

2.創建信道:

$channel = new AMQPChannel($conn);

3.創建交換機對象:

//創建交換機
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_FANOUT); //fanout類型
$ex->setFlags(AMQP_DURABLE); //持久化
//$ex->declareExchange(); 只有direct 類型的纔可以聲明

4.創建隊列並綁定到交換機/路由:

//創建隊列
$q = new AMQPQueue($channel);
$q->setName($q_name);
$q->setFlags(AMQP_DURABLE); //持久化
$q->declareQueue();
//綁定交換機與隊列,並指定路由鍵
$q->bind($e_name, 'key_2');

5.推送消息:

//模擬推送
for($i = 0; $i < 20000; $i++) {
    $ex->publish("message $i", "routekey");
}

消費者(consume.php):
*阻塞接收:

// 消息接收
$config = array(
    'host' => '127.0.0.1',
    'vhost' => '/',
    'port' => 5672,
    'login' => 'guest',
    'password' => '123456'
);
$connection = new AMQPConnection($config);
$connection->connect();
$channel = new AMQPChannel($connection);
$queue = new AMQPQueue($channel);
$queue->declareQueue();
$queue->bind('exchange1', 'routekey');

while (true) {
  $queue->consume(function($envelope, $queue){
   echo $envelope->getBody(), PHP_EOL;
  }, AMQP_AUTOACK);
}

cli模式下,先運行consume.php,再運行publish.php,就會看到發佈的消息會被輸出處理,當然也可以在同一個文件(或方法),在發佈之後直接將消息消費,但是我們不建議這樣做。

二、官方推薦類庫

1. 安裝composer:
這裏不多贅述
2. 項目文件夾下面新建composer.json文件:

  {
     "require": {
      "php-amqplib/php-amqplib": "2.6.1"
     }
 }

那就進入到你的項目文件夾,拉取/更新一下吧。

composer install
composer update

3. 發送數據:

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

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

$channel->queue_declare('hello', false, false, false, false);
$msg = new AMQPMessage('Hello World!');
for ($i = 0; $i < 2000; $i++) {
    $channel->basic_publish($msg, '', 'hello');
}

echo "Sent 'Hello World!'\n";
$channel->close();
$connection->close();

4. 獲取數據:

require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', '123456');
$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";
};

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

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

查看當前隊列:

 rabbitmqctl list_queues

:以上的兩種方法,爲最簡單的發送->獲取模式,我們在使用過程中,需注意以下幾點:1)必須首先啓用消費者程序,在生產者生產消息的時候(運行生產者程序的時候),消費者纔會獲取到數據。
2)消息消費之後,另外的消費者不能二次消費哦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章