官網原文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發送的消息了