日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

php rabbmq教程_RabbitMQ+PHP 教程一(Hello World)

發布時間:2023/11/28 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php rabbmq教程_RabbitMQ+PHP 教程一(Hello World) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

RabbitMQ是一個消息代理器:它接受和轉發消息。你可以把它當作一個郵局:當你把郵件放在信箱里時,你可以肯定郵差先生最終會把郵件送到你的收件人那里。在這個比喻中,RabbitMQ就是這里的郵箱,郵局和郵差。

RabbitMQ和郵局之間的主要區別是,它不處理紙張,而是接受、存儲和轉發二進制數據?消息。

RabbitMQ,和一般的消息傳遞,使用專業術語。

生產者的工作就是發送消息。發送消息的程序是生產者:

隊列類比一個郵箱,存在于RabbitMQ, 然而信息流通過RabbitMQ和您的應用程序,他們只能存儲在一個隊列。隊列只受主機內存和磁盤限制的約束,它本質上是一個很大的消息緩沖區。會有許多生產者可以發送到一個隊列的消息,許多消費者可以嘗試從一個隊列接收數據。這就是我們如何表示隊列的方式:

消費者和生產者有著相似的意義. 消費者無非就是等待消息然后處理的程序:

請注意,生產者、消費者和代理不必同一主機上;事實上,在大多數應用程序中它們沒有這樣做。

"Hello World"

(使用PHP amqplib客戶端)

在本教程的這一部分中,我們將用PHP編寫兩個程序;一個生產者發送一條消息,一個用戶接收消息并將它們打印出來。我們會PHP amqplib API的忽略一些細節,集中在這個非常簡單的事情剛剛開始。這是一個“Hello World”的消息傳遞。

在下圖中,“p”是我們的生產商,“C”是我們的消費者。在中間的框是一個隊列的消息緩沖區,RabbitMQ保持代表的消費。

PHP amqplib客戶端庫

RabbitMQ有很多協議。本教程介紹AMQP 0-9-1,這是一個開放的、通用的協議消息。有許多不同的語言RabbitMQ一批客戶。我們將在本教程中使用PHP amqplib,composer解決依賴管理。

添加composer.json:

{

"require": {

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

}

}

composer install

# 或者 直接運行包引入

composer require php-amqplib/php-amqplib

現在我們可以開始我們的hello world

生產者(消息發送方)

我們命令我們的消息發布者(發送者)send.php和消息接收receive.php。發送者將連接到RabbitMQ,發送一條消息,然后退出。

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

use PhpAmqpLib\Connection\AMQPStreamConnection;

use PhpAmqpLib\Message\AMQPMessage;

現在我們能創建一個連接服務器的Connection:

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');

$channel = $connection->channel();

該連接抽象套接字(socket)連接,并為我們負責協議版本協商和認證等。這里,我們連接到一個rabbitmq代理器在本地機器上-使用localhost。如果我們想在不同的機器上連接到一個代理,我們只需在這里指定它的名稱或IP地址。

接下來,我們創建一個通道,這是處理事情的大部分API的地方。

發送消息前,我們必須聲明一個隊列為我們發送做準備;然后我們可以向隊列發布消息:

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

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

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

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

聲明隊列是冪等的(原句:Declaring a queue is idempotent,這里的idempotent不知道是什么意思) - 只有在它不存在時才會創建隊列。消息內容是一個字節數組,因此您可以在那里編碼用你喜歡的方式。

最后,我們關閉通道和連接;

$channel->close();

$connection->close();

上面我們完成了send.php.

接下來我們完成消費方的代碼

消費者(接收方,任務處理方)

消費者從RabbitMQ接收推來的消息,我們會保持運行監聽消息并打印出來。

引入lib

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

注意,我們也在這里聲明隊列。因為我們可能在發布之前啟動消費者,我們希望在我們嘗試從它那里消費消息之前確定隊列的存在。

我們將告訴服務器從隊列中發送消息。我們將定義一個PHP可調用,它將接收服務器發送的消息。請記住,消息是從服務器異步發送到客戶機的。

$callback = function($msg) {

echo " [x] Received ", $msg->body, "\n";

};

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

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

$channel->wait();

}

當調用basic_consume,我們的代碼會阻塞。當我們收到消息時,我們的回調函數將通過接收到返回的消息傳遞。

以上是我們receive.php的代碼

運行測試

運行消費者

php receive.php

運行消息發送方

php send.php

列出隊列

rabbitmqctl list_queues

完整源碼(調整過)

config.php

return [

'vendor' => [

'path' => dirname(dirname(__DIR__)) . '/vendor'

],

'rabbitmq' => [

'host' => '127.0.0.1',

'port' => '5672',

'login' => 'qkl',

'password' => '123456',

'vhost' => '/'

]

];

?>

receive.php

$config = require "../config.php";

require_once $config['vendor']['path'] . '/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;

use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection($config['rabbitmq']['host'], $config['rabbitmq']['port'],

$config['rabbitmq']['login'], $config['rabbitmq']['password'], $config['rabbitmq']['vhost']);

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

?>

send.php

$config = require "../config.php";

require_once $config['vendor']['path'] . '/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;

use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection($config['rabbitmq']['host'], $config['rabbitmq']['port'],

$config['rabbitmq']['login'], $config['rabbitmq']['password'], $config['rabbitmq']['vhost']);

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

?>

總結

以上是生活随笔為你收集整理的php rabbmq教程_RabbitMQ+PHP 教程一(Hello World)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。