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