PHP RabbitMQ 是一個(gè)應(yīng)用程序消息隊(duì)列協(xié)議的開源實(shí)現(xiàn),它是用于交換數(shù)據(jù)的一種高效的方式,利用 RabbitMQ ,我們可以使各種應(yīng)用程序 松散耦合 的公正分為 獨(dú)立服務(wù) ,RabbitMQ 提供了持久化消息、靈活的路由、死信隊(duì)列、事務(wù)以及許多其他高級(jí)功能。PHP RabbitMQ 也可以和 PHP 開發(fā)的應(yīng)用程序很好的集成在一起,并為開發(fā)者提供了訪問消息隊(duì)列的強(qiáng)大功能。
下面我們就來手把手的操作一下PHP RabbitMQ,首先我們需要通過以下命令來安裝 RabbitMQ PHP 擴(kuò)展。
yum install php-common php-cli php-mbstring php-opcache php-pdo php-mysqlnd php-gd php-mcrypt php-mysql rabbitmq-server
安裝完成以后你就會(huì)發(fā)現(xiàn)你的 PHP 中多了AMQP擴(kuò)展,接下來我們來看一下 RabbitMQ 的一些核心的概念。
Exchange:主要負(fù)責(zé)接收生產(chǎn)者的消息并進(jìn)行消息路由,分發(fā)到對應(yīng)的隊(duì)列中。Queue:用于存儲(chǔ)生產(chǎn)者發(fā)送到 Exchange 的消息,經(jīng)過路由分配的消息將會(huì)被放到一個(gè)或多個(gè)隊(duì)列中等待消費(fèi)者進(jìn)一步處理。Consumer:用于實(shí)現(xiàn)對隊(duì)列中消息的處理,消費(fèi)者從隊(duì)列獲取消息并將其轉(zhuǎn)換為操作。
通過了解這些概念,我們就可以來構(gòu)建一個(gè)簡單的 RabbitMQ 應(yīng)用。下面是一個(gè)消息生產(chǎn)者的示例代碼:
// 定義 RabbitMQ 服務(wù)器的連接配置 $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); // 建立一個(gè)與服務(wù)器的連接 $channel = $connection->channel(); // 聲明一個(gè) exchange ,并設(shè)置它的類型為 direct $channel->exchange_declare('exchange_name', 'direct', false, false, false); // 創(chuàng)建一個(gè)消息,并設(shè)置消息的路由鍵和消息體 $message_body = 'Hello, world!'; $message = new AMQPMessage($message_body, array('content_type' => 'text/plain')); // 發(fā)送消息到指定的 exchange,同時(shí)使用特定的路由鍵進(jìn)行路由 $channel->basic_publish($message, 'exchange_name', 'routing_key'); // 斷開連接 $channel->close(); $connection->close();
上述代碼通過創(chuàng)建一個(gè)連接、聲明一個(gè)交換機(jī)、創(chuàng)建消息、發(fā)送消息、關(guān)閉連接的流程實(shí)現(xiàn)了消息的生成。 下面是一個(gè)消息消費(fèi)者的示例如下:
// 定義 RabbitMQ 服務(wù)器的連接配置 $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); // 建立一個(gè)與服務(wù)器的連接 $channel = $connection->channel(); // 聲明一個(gè) exchange ,并設(shè)置它的類型為 direct $channel->exchange_declare('exchange_name', 'direct', false, false, false); // 聲明一個(gè)路由鍵,并將其綁定到特定的 exchange 上 $queue_name = 'queue_name'; $channel->queue_declare($queue_name, false, false, false, false); $channel->queue_bind($queue_name, 'exchange_name', 'routing_key'); // 定義回調(diào)函數(shù),用于處理從隊(duì)列中獲取到的消息 $callback = function($message) { echo "Receive message is:\n"; echo $message->body."\n"; }; // 開始消費(fèi)隊(duì)列消息 $channel->basic_consume($queue_name, '', false, true, false, false, $callback); while(count($channel->callbacks)) { $channel->wait(); } // 斷開連接 $channel->close(); $connection->close();
上述代碼主要是通過 創(chuàng)建一個(gè)連接、定義隊(duì)列、綁定路由、定義回調(diào)函數(shù)、開啟消費(fèi)的流程實(shí)現(xiàn)了消費(fèi)者接收并處理消息的邏輯。通過上面的示例你可以看到,使用 PHP RabbitMQ 可以非常簡單優(yōu)雅的實(shí)現(xiàn)應(yīng)用程序間的消息傳遞,為開發(fā)者提供了非常方便的工具。
PHP RabbitMQ 可以方便的與其他常見的 PHP 框架集成,比如 Laravel 等,對于大規(guī)模的分布式系統(tǒng)開發(fā),使用消息隊(duì)列是非常重要的一環(huán),這樣可以使應(yīng)用程序松散耦合、更加靈活。我們希望 PHP RabbitMQ 能夠在你的開發(fā)過程中發(fā)揮出真正的價(jià)值。