rabbitmq+php入門簡介

官網原文http://www.rabbitmq.com/tutorials/tutorial-one-php.html

安裝rabbitmq server和php擴展參考

https://mp.csdn.net/postedit/84646144

介紹

RabbitMQ是一個消息代理:它接受並轉發消息。你可以把它當成一個郵局:當你想郵寄信件的時候,你會把信件放在投遞箱中,並確信郵遞員最終會將信件送到收件人的手裏。在這個例子中,RabbitMQ就相當與投遞箱、郵局和郵遞員。

RabbitMQ與郵局的區別在於:RabbitMQ並不處理紙質信件,而是接受、存儲並轉發二進制數據---消息。

談到RabbitMQ的消息,通常有幾個術語:

  • 生產者:是指發送消息的程序

  • 隊列:相當於RabbitMQ的投遞箱。儘管消息在RabbitMQ和你的應用之間傳遞,但是消息僅僅會在隊列之中存儲。隊列只能存儲在內存或磁盤中,本質上是一個大的消息緩衝區。不同的生產者可以發送消息到同一個對隊列,不同的消費者也可以從同一個隊列中獲取消息。

  • 消費者:等待接受消息的程序。

注意,生產者、消費者以及RabbitMQ並不一定要在同一個主機上,在絕大部分的應用中它們都不在同一主機上。

如下圖

P代表生產者,C代表消費者,中間紅色的小箱子就代表隊列--RabbitMQ爲了讓消費者收到消息而保持的消息緩衝區

 

接下來編寫下hello world

RabbitMQ使用多種協議。本教程介紹AMQP 0-9-1,這是一個用於消息傳遞的開放通用協議

本教程中使用php-amqplib和Composer進行依賴關係管理。

1.先使用composer安裝php-amqplib依賴

在項目中新建composer.json

{

    "require": {

        "php-amqplib/php-amqplib": ">=2.6.1"

    }

}

執行 composer install

//確保你的服務器已經安裝了composer,centos環境安裝composer方法https://mp.csdn.net/postedit/84654805

 

2.生產者

編寫發送程序sending

 

生產者先連接到rabbitMQ.發送一個消息

在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();

該連接抽象套接字(socket)連接,併爲我們負責協議版本協商和認證等。這裏,我們連接到一個rabbitmq代理器在本地機器上-使用localhost。如果我們想在不同的機器上連接到一個代理,我們只需在這裏指定它的名稱或IP地址。guest爲賬號密碼,rabbitmq安裝完默認有生成該賬號

接着創建一個通道,聲明一個隊列

$channel->queue_declare('hello', false, false, false, false);

$msg = new AMQPMessage('Hello World!);

//發佈$msg消息放到hello隊列中

$channel->basic_publish($msg, '', 'hello');

echo " [x] Sent 'Hello World!'\n;

關閉連接channel和連接

$channel->close();

$connection->close();

send.php完整代碼

<?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');

echo " [x] Sent 'Hello World!'\n";

$channel->close();

$connection->close();

?>

receiving接收消息

 

 

 

3.消費者

消費者從rabbitmq中讀取出消息並打印出來,與生產者不同,我們需保持消費者程序一直運行監聽並把消息打印出來。

接着,就來編寫一個消費者程序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";

};

 

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

 

while (count($channel->callbacks)) {

    $channel->wait();

}

完整的receive.php代碼

<?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";

};

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

while (count($channel->callbacks)) {

    $channel->wait();

}

$channel->close();

$connection->close();

下面演示下

執行php send.php

打開另一個終端窗口,

執行php receive.php

就可以接口到send發送的消息了

 

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