PHP 通過 AMQP 庫使用 RabbitMQ 的簡單示例Demo

測試步驟和項目結構

測試步驟

安裝 RabbitMQ 和 PHP 的步驟就不在這裏說了。測試步驟如下:

  1. 創建測試項目的目錄 mq
  2. 從 https://github.com/php-amqplib/php-amqplib 下載AMQP庫(當然也可以通過 composer 安裝,這裏爲了簡單直接自己處理了),放入 mq 目錄
  3. 編寫 index.php,實現自動加載
  4. 創建 test 目錄,裏面分別創建 mqc.php 消費者和 mqp.php 生產者兩個文件
  5. 跑腳本,測試消息的生產和消費:
    • php -f index.php mqp 生產消息
    • php -f index.php mqc 消費消息

目錄結構

├─PhpAmqpLib
│  ├─Channel
│  ├─Connection
│  ├─Exception
│  ├─Exchange
│  ├─Helper
│  │  └─Protocol
│  ├─Message
│  └─Wire
│      └─IO
├─test
│  ├─mqc.php
│  └─mqp.php
└─index.php

源碼

index.php

<?php

// 根據 namespace 自動加載
function my_autoloader($cName) {
	include(__DIR__."/".$cName.".php");
}
spl_autoload_register("my_autoloader");


// 調生產者
function mqp() {
	$p = new \test\mqp();
	$p->p();
}


// 調消費者
function mqc() {
	$c = new \test\mqc();
	$c->c();
}


// 取命令行參數,執行對應函數
if (function_exists($argv[1])) {
	$argv[1]();
}

mqc.php

<?php

namespace test;

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

class mqc {
	public function c() {
		$host = 'localhost';
		$port = 5672;
		$user = 'guest';
		$password = 'guest';

		$connection = new AMQPStreamConnection($host, $port, $user, $password, '/', false, 'AMQPLAIN', null, 'en_US', 3.0, 120.0, null, true, 60);
		$channel = $connection->channel();

		$channel->exchange_declare('myExchange', 'direct', false, true, false);
		$channel->queue_declare('myQueue', false, true, false, false);

		//閉包回調函數
		$callback = function ($msg) {
			echo $msg->body;
			echo PHP_EOL;
		};
		$channel->basic_consume('myQueue', '', false, false, false, false, $callback);

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

}

mqp.php

<?php

namespace test;

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

class mqp {
	public function p() {
		echo 22;

		$host = 'localhost';
		$port = 5672;
		$user = 'guest';
		$password = 'guest';

		$connection = new AMQPStreamConnection($host, $port, $user, $password, '/', false, 'AMQPLAIN', null, 'en_US', 3.0, 120.0, null, true, 60);
		$channel = $connection->channel();

		$channel->exchange_declare('myExchange', 'direct', false, true, false);
		$channel->queue_declare('myQueue', false, true, false, false);
		$channel->queue_bind('myQueue', 'myExchange', 'my');

		//準備消息
		$msg = new AMQPMessage('hello,我要發送的消息內容~~~'.time());
		$channel->basic_publish($msg, 'myExchange', 'my');

		$channel->close();
		$connection->close();
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章