官网原文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发送的消息了