rabbitmq+php入门简介

官网原文http://www.rabbitmq.com/tutorials/tutorial-one-php.html

安装rabbitmq server和php扩展参考

https://mp.csdn.net/postedit/84646144

介绍

RabbitMQ是一个消息代理:它接受并转发消息。你可以把它当成一个邮局:当你想邮寄信件的时候,你会把信件放在投递箱中,并确信邮递员最终会将信件送到收件人的手里。在这个例子中,RabbitMQ就相当与投递箱、邮局和邮递员。

RabbitMQ与邮局的区别在于:RabbitMQ并不处理纸质信件,而是接受、存储并转发二进制数据---消息。

谈到RabbitMQ的消息,通常有几个术语:

  • 生产者:是指发送消息的程序

  • 队列:相当于RabbitMQ的投递箱。尽管消息在RabbitMQ和你的应用之间传递,但是消息仅仅会在队列之中存储。队列只能存储在内存或磁盘中,本质上是一个大的消息缓冲区。不同的生产者可以发送消息到同一个对队列,不同的消费者也可以从同一个队列中获取消息。

  • 消费者:等待接受消息的程序。

注意,生产者、消费者以及RabbitMQ并不一定要在同一个主机上,在绝大部分的应用中它们都不在同一主机上。

如下图

P代表生产者,C代表消费者,中间红色的小箱子就代表队列--RabbitMQ为了让消费者收到消息而保持的消息缓冲区

 

接下来编写下hello world

RabbitMQ使用多种协议。本教程介绍AMQP 0-9-1,这是一个用于消息传递的开放通用协议

本教程中使用php-amqplib和Composer进行依赖关系管理。

1.先使用composer安装php-amqplib依赖

在项目中新建composer.json

{

    "require": {

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

    }

}

执行 composer install

//确保你的服务器已经安装了composer,centos环境安装composer方法https://mp.csdn.net/postedit/84654805

 

2.生产者

编写发送程序sending

 

生产者先连接到rabbitMQ.发送一个消息

在send.php,我们需要先引入需要的库和类

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

use PhpAmqpLib\Connection\AMQPStreamConnection;

use PhpAmqpLib\Message\AMQPMessage;

接着创建一个连接到服务器

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

$channel = $connection->channel();

该连接抽象套接字(socket)连接,并为我们负责协议版本协商和认证等。这里,我们连接到一个rabbitmq代理器在本地机器上-使用localhost。如果我们想在不同的机器上连接到一个代理,我们只需在这里指定它的名称或IP地址。guest为账号密码,rabbitmq安装完默认有生成该账号

接着创建一个通道,声明一个队列

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

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

//发布$msg消息放到hello队列中

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

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

关闭连接channel和连接

$channel->close();

$connection->close();

send.php完整代码

<?php

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

use PhpAmqpLib\Connection\AMQPStreamConnection;

use PhpAmqpLib\Message\AMQPMessage;

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

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

?>

receiving接收消息

 

 

 

3.消费者

消费者从rabbitmq中读取出消息并打印出来,与生产者不同,我们需保持消费者程序一直运行监听并把消息打印出来。

接着,就来编写一个消费者程序receive.php

与生产者程序相同,首先引入

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;

 

定义一个回调函数来处理消息

$callback = function ($msg) {

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

};

 

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

 

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

    $channel->wait();

}

完整的receive.php代码

<?php

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

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

下面演示下

执行php send.php

打开另一个终端窗口,

执行php receive.php

就可以接口到send发送的消息了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章