[rabbitMQ]四、rabbitMQ队列之简单模式(simple)

简单的点对点消息模型。开启mq服务,开启进程P 生产者向mq 写消息,进程C消费者监听mq,消费消息。我们来简单模拟一下。

一、原生rabbitmq

生产者(publish.php):

1.创建连接:

$config = array(
    'host' => '127.0.0.1',
    'port' => '5672',
    'login' => 'guest',
    'password' => '123456',
    'vhost'=>'/'
);

$e_name = 'exchange1'; //交换机名
$q_name = 'queue1'; //队列名
$k_route = 'routekey'; //路由key

//创建连接和channel
$conn = new AMQPConnection($config);
if (!$conn->connect()) {
    die("Cannot connect to the broker!\n");
}

2.创建信道:

$channel = new AMQPChannel($conn);

3.创建交换机对象:

//创建交换机
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_FANOUT); //fanout类型
$ex->setFlags(AMQP_DURABLE); //持久化
//$ex->declareExchange(); 只有direct 类型的才可以声明

4.创建队列并绑定到交换机/路由:

//创建队列
$q = new AMQPQueue($channel);
$q->setName($q_name);
$q->setFlags(AMQP_DURABLE); //持久化
$q->declareQueue();
//绑定交换机与队列,并指定路由键
$q->bind($e_name, 'key_2');

5.推送消息:

//模拟推送
for($i = 0; $i < 20000; $i++) {
    $ex->publish("message $i", "routekey");
}

消费者(consume.php):
*阻塞接收:

// 消息接收
$config = array(
    'host' => '127.0.0.1',
    'vhost' => '/',
    'port' => 5672,
    'login' => 'guest',
    'password' => '123456'
);
$connection = new AMQPConnection($config);
$connection->connect();
$channel = new AMQPChannel($connection);
$queue = new AMQPQueue($channel);
$queue->declareQueue();
$queue->bind('exchange1', 'routekey');

while (true) {
  $queue->consume(function($envelope, $queue){
   echo $envelope->getBody(), PHP_EOL;
  }, AMQP_AUTOACK);
}

cli模式下,先运行consume.php,再运行publish.php,就会看到发布的消息会被输出处理,当然也可以在同一个文件(或方法),在发布之后直接将消息消费,但是我们不建议这样做。

二、官方推荐类库

1. 安装composer:
这里不多赘述
2. 项目文件夹下面新建composer.json文件:

  {
     "require": {
      "php-amqplib/php-amqplib": "2.6.1"
     }
 }

那就进入到你的项目文件夹,拉取/更新一下吧。

composer install
composer update

3. 发送数据:

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

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

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', '123456');
$channel = $connection->channel();

$channel->queue_declare('hello', false, false, false, false);
$msg = new AMQPMessage('Hello World!');
for ($i = 0; $i < 2000; $i++) {
    $channel->basic_publish($msg, '', 'hello');
}

echo "Sent 'Hello World!'\n";
$channel->close();
$connection->close();

4. 获取数据:

require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', '123456');
$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();
}

查看当前队列:

 rabbitmqctl list_queues

:以上的两种方法,为最简单的发送->获取模式,我们在使用过程中,需注意以下几点:1)必须首先启用消费者程序,在生产者生产消息的时候(运行生产者程序的时候),消费者才会获取到数据。
2)消息消费之后,另外的消费者不能二次消费哦

上一页 下一页

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值