PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (一) -- 安装 AMQP 扩展和 Direct Exchange 模式
Windows 安装 amqp 扩展
- 下载相应版本的 amqp 扩展:http://pecl.php.net/package/amqp,解压缩文件。
- 将 php_amqp.dll 复制到 php 的扩展目录 ext 下,修改配置文件 php.ini:
[amqp]
extension=php_amqp.dll - 将 rabbitmq.*.dll 文件复制到 php 的安装目录下,然后修改 Apache 配置文件 httpd.conf:
#[rabbitmq]
LoadFile "F:\wamp64\bin\php\php7.0.10\rabbitmq.*.dll" - 重启服务器,查看 phpinfo,确认扩展信息。
Direct Exchange 模式
Direct Exchange 模式的交换机适合用于消息的单播发送. 交换机根据推送消息时的 routing key 和 队列的 routing key 判断消息应该推送到哪个队列. 可以实现同一交换机上的消息, 根据 routing key 推送到不同的队列中.
默认 Direct Exchange
此种模式下,使用 RabbitMQ 的默认 Exchange 即可,默认的 Exchange 是 Direct 模式。使用默认 Exchange 时,不需要对 Exchange 进行属性设置和声明,也不需要对 Queue 进行显示绑定和设置 routing key。Queue 默认会绑定到默认 Exchange,以及默认 routing key 与 Queue 的名称相同。
- 创建连接并发起连接
- 在连接上创建通道
- 在通道上获取默认交换机
- 向交换机发送消息
header('Content-Type: text/html; charset=utf-8');
// 连接设置
$conConfig = [
'host' => '127.0.0.1',
'port' => 5672,
'login' => 'root',
'password' => 'root',
'vhost' => '/'
];
try
{
// RabbitMQ 连接实例
$con = new AMQPConnection($conConfig);
// 发起连接
$con->connect();
// 判断连接是否仍然有效
if(!$con->isConnected())
{
echo '连接失败';die;
}
// 新建通道
$channel = new AMQPChannel($con);
// 使用RabbitMQ的默认Exchange
$exchange = new AMQPExchange($channel);
for($i = 1; $i < 6; $i++)
{
$message = [
'name' => '默认交换机,消息-' . $i,
'info' => 'Hello World!'
];
// 发送消息,为消息指定routing key,成功返回true,失败false
$state = $exchange->publish(json_encode($message, JSON_UNESCAPED_UNICODE), 'test.queue1');
if($state)
{
echo 'Success' . PHP_EOL;
}else
{
echo 'Fail' . PHP_EOL;
}
}
// 关闭连接
$con->disconnect();
}catch(Exception $e)
{
echo $e->getMessage();
}
- 创建连接并发起连接
- 在连接上创建通道
- 在通道上创建队列并声明队列
- 从队列获取消息
header('Content-Type: text/html; charset=utf-8');
$conConfig = [
'host' => '127.0.0.1',
'port' => 5672,
'login' => 'root',
'password' => 'root',
'vhost' => '/'
];
try
{
$con = new AMQPConnection($conConfig);
$con->connect();
if(!$con->isConnected())
{
echo '连接失败';die;
}
$channel = new AMQPChannel($con);
$queue = new AMQPQueue($channel);
$queue->setName('test.queue1');
// 声明队列,不需要对Queue进行显示绑定到交换机和指定Queue的routing key
$queue->declareQueue();
$queue->consume(function($envelope, $queue)
{
echo $envelope->getBody() . PHP_EOL;
}, AMQP_AUTOACK);
$con->disconnect();
}catch(Exception $e)
{
echo $e->getMessage();
}
自定义 Direct Exchange
header('Content-Type: text/html; charset=utf-8');
// 连接设置
$conConfig = [
'host' => '127.0.0.1',
'port' => 5672,
'login' => 'root',
'password' => 'root',
'vhost' => '/'
];
try
{
// RabbitMQ 连接实例
$con = new AMQPConnection($conConfig);
// 发起连接
$con->connect();
// 判断连接结果,true成功,false失败
if(!$con->isConnected())
{
echo '连接失败';die;
}
// 新建通道
$channel = new AMQPChannel($con);
// 新建交换机
$exchange = new AMQPExchange($channel);
// 交换机名称
$exchange->setName('test.direct');
// 交换机类型
$exchange->setType('direct');
// 声明交换机
$exchange->declareExchange();
for($i = 1; $i < 6; $i++)
{
$message = [
'name' => 'direct交换机,消息-' . $i,
'info' => 'Hello World!'
];
// 发送消息,同时为消息指定routing key,成功返回true,失败false
$state = $exchange->publish(json_encode($message, JSON_UNESCAPED_UNICODE), 'test.queue1');
if($state)
{
echo 'Success' . PHP_EOL;
}else
{
echo 'Fail' . PHP_EOL;
}
}
// 关闭连接
$con->disconnect();
}catch(Exception $e)
{
echo $e->getMessage();
}
header('Content-Type: text/html; charset=utf-8');
$conConfig = [
'host' => '127.0.0.1',
'port' => 5672,
'login' => 'root',
'password' => 'root',
'vhost' => '/'
];
try
{
$con = new AMQPConnection($conConfig);
$con->connect();
if(!$con->isConnected())
{
echo '连接失败';die;
}
$channel = new AMQPChannel($con);
$exchange =new AMQPExchange($channel);
$exchange->setName("test.direct");
$exchange->setType('direct');
$exchange->setFlags(AMQP_DURABLE);
$exchange->declareExchange();
$queue = new AMQPQueue($channel);
$queue->setName('test.queue1');
// 声明队列,不需要对Queue进行显示绑定到交换机和指定Queue的routing key
$queue->declareQueue();
// 绑定队列到指定交换机,并指定routing key,即分发规则,消息的routing key与队列的绑定routing key匹配时才
$queue->bind('test.direct', 'test.queue1');
$queue->consume(function($envelope, $queue)
{
echo $envelope->getBody() . PHP_EOL;
}, AMQP_AUTOACK);
$con->disconnect();
}catch(Exception $e)
{
echo $e->getMessage();
}
PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (一) -- 安装 AMQP 扩展和 Direct Exchange 模式的更多相关文章
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (四) -- Push API 和 Pull API
RabbitMQ 中针对消息的分发提供了 Push API (订阅模式) 和 Pull API (主动获取) 两种模式. 在 PHP 中, 这两种模式分别通过 AMQPQueue 类中的 consum ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (三) -- Header Exchange
此模式下,消息的routing key 和队列的 routing key 会被完全忽略,而是在交换机推送消息和队列绑定交换机时, 分别为消息和队列设置 headers 属性, 通过匹配消息和队列的 h ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (二) -- Topic Exchange 和 Fanout Exchange
Topic Exchange 此模式下交换机,在推送消息时, 会根据消息的主题词和队列的主题词决定将消息推送到哪个队列. 交换机只会为 Queue 分发符合其指定的主题的消息. 向交换机发送消息时,消 ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (五) -- 自动 ACK、手动 ACK、NACK
以 Direct 类型的 交换机和 Queue 的 get 方法为例. producer.php // 连接设置 $conConfig = [ 'host' => '127.0.0.1', 'p ...
- RabbitMQ简单介绍+Windows环境安装
文章目录 1.RabbitMQ简介2.RabbitMQ与其他MQ有什么不同3.RabbitMQ环境安装3.1 安装erlang3.2 安装rabbitmq-server4. RabbitMQ管理平台介 ...
- gtk+3.0的环境配置及基于gtk+3.0的python简单样例
/********************************************************************* * Author : Samson * Date ...
- AMQP消息队列之RabbitMQ简单示例
前面一篇文章讲了如何快速搭建一个ActiveMQ的示例程序,ActiveMQ是JMS的实现,那这篇文章就再看下另外一种消息队列AMQP的代表实现RabbitMQ的简单示例吧.在具体讲解之前,先通过一个 ...
- Linux下,如何给PHP安装pdo_mysql扩展
下载了一个免费开源的广告系统(openadserver),在Linux上安装时,提示要安装 pdo_mysql 扩展,先前有过编译安装 soap扩展 的经历,今天要编译安装 pdo_mysql 扩展, ...
- RabbitMQ基础知识及Linux安装
RabbitMQ: RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现. AMQP协议: AMQP,即Advanced Message Qu ...
随机推荐
- 【HDU 1561】 The More,The better
[题目链接] 点击打开链接 [算法] 树形背包 注意是一棵森林 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN ...
- 使用slot分发内容 作用域插槽
除非子组件模板包含至少一个<slot>插口,否则父组件的内容将会别丢弃.当子组件模板只有一个没有属性的slot时,父组件整个内容片断将插入到slot所在的DOM位置,并替换掉slot标签本 ...
- supervisor - Python进程管理工具
经常会碰到要写一些守护进程,简单做法放入后台: shell> nohup python xxx.py & 偶尔这么做还可以接受,如果一堆这样的呢? 当然还有一个问题,就是各种服务,对应的 ...
- Struts Filter告警:FilterDispatcher <<< is deprecated! Please use the new filters!
在struts2.3.14下,web.xml中使用 <filter> <filter-name>struts2</filter-name> <!-- < ...
- bzoj 4898: [Apio2017]商旅【Floyd+分数规划+二分】
其实并不会分数规划 因为要最大化 ans=总收益/总路程 ,所以考虑二分答案,找到一条 ans<=总收益/总路程 的回路.先预处理出d(i,j)为(i,j)最短路,w(i,j)为在i买某个物品在 ...
- 【原创】《从0开始学RocketMQ》—单机搭建
内容目录 1. RocketMQ是什么? 2. 下载并解压 3. 启动NameServer 4. 启动 Broker 5. 关闭消息队列 1. RocketMQ是什么? RocketMQ是一种消息队列 ...
- javascript---DOM大编程
编程练习 制作一个表格,显示班级的学生信息. 要求: 1. 鼠标移到不同行上时背景色改为色值为 #f2f2f2,移开鼠标时则恢复为原背景色 #fff 2. 点击添加按钮,能动态在最后添加一行 3. 点 ...
- linux下创建用户及组
linux下创建用户及组: 1.创建组 groupadd 组名 2.创建用户,并将用户添加到组 useradd 用户名 -g 组名 3.更改用户的密码 password 用户名 4.修改目录 ...
- Stamps ans Envelope Sive UVA - 242
( ||{集合x}表示x中元素1||x中元素2||...||x的最后一个元素||(a,b)表示a||b) ans[i][j][k]表示考虑前i种邮票时取j个邮票能否得到面值kans[i][j][k]= ...
- 暴力/DP Codeforces Beta Round #22 (Div. 2 Only) B. Bargaining Table
题目传送门 /* 题意:求最大矩形(全0)的面积 暴力/dp:每对一个0查看它左下的最大矩形面积,更新ans 注意:是字符串,没用空格,好事多磨,WA了多少次才发现:( 详细解释:http://www ...