官网原文:
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发送的消息了
来源:
https://blog.csdn.net/sinat_14826983/article/details/84729479
![5bca09fba9e6056a41dd84657b474415.png](https://i-blog.csdnimg.cn/blog_migrate/a76d0c949697ebeb02ea2e73ed503b92.png)
![f85c05f1c4f4442fe429a317e84619cc.gif](https://i-blog.csdnimg.cn/blog_migrate/52a3f88fe3656c71e227a17aa57982d0.gif)
![9abf549a26faa0f1498843eee48dc5fe.png](https://i-blog.csdnimg.cn/blog_migrate/8ece1058ac4ce7013e703dba4d861a56.jpeg)
![214c21650b3f82166c4ad78d3c16474c.gif](https://i-blog.csdnimg.cn/blog_migrate/28f9450bc9e6a6e31e834e5929e32ab9.gif)