https://www.1024.cn
rabbitMq(消息队列)
- 一种程序对程序的通信方法
- 实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)
- erlang编写
- 特性:
①可伸缩性:集群服务
② 消息持久化:从内存持久化消息到硬盘,再从硬盘加载到内存 - AMQP:典型的“生产/消费”消息模型
AMQP扩展安装
- 根据phpinfo()查看版本等
- php版本
- 32位还是64位
- 线程是否激活
- 下载amqp,地址:https://pecl.php.net/package/amqp
- 将php_amqp.dll文件放到 php 目录下的ext文件夹下面
- 然后,再将 rabbitmq.4.dll (有些是rabbitmq.1.dll )文件放到 php 根目录下
- 然后,在 php.ini 最后加extension=php_amqp.dll
- 重启apache
- 安装erlang(rabbitmq 服务端代码是使用并发式语言Erlang编写),下载地址:http://www.erlang.org/downloads (根据电脑系统版本 64/32)
- 安装好之后,要配置一下环境变量:此电脑–>鼠标右键“属性”–>高级系统设置–>环境变量–>“新建”系统环境变量
- 最后 windows键+R键,输入 cmd,再输入erl,看到版本号,就说明erlang安装成功了
- 安装 RabbitMQ,下载地址https://www.rabbitmq.com/download.html
- 双击安装,再安装RabbitMQ-Plugins。打开命令行,cd切换到rabbitmq 的 sbin目录。
我的目录是:D:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.17\sbin ,然后在后面输入rabbitmq-plugins enable rabbitmq_management命令进行安装。
- 打开网址:http://localhost:15672 用上面的账号和密码登陆进去
php测试
- php-amqplib 这个封装好的类库,添加composer.json文件
{
"require": {
"php-amqplib/php-amqplib":"2.6.1"
}
}
- 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();
- recv.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();