[转载]PHP 连接 Rabbitmq 实例代码
转自 http://www.dahouduan.com/2017/11/23/php-rabbitmq-demo/
接下来我们用 php 连接 rabbitmq 玩一玩。
还没有安装 rabbitmq ,请参考 Rabbitmq 安装
还没有安装 PHP 的 AMQP 扩展,参考PHP AMQP 扩展安装
一些概念
Rabbitmq 是一个功能很强大消息队列系统,使用起来可能不像某些 push 、pop 类型的队列简单(比如 redis 的list),Rabbitmq 支持消息的订阅发布模式,方便大型系统各个服务组件之间解耦和通信。我们首先要了解一些基本概念
Vhost: 可以先不深究,固定为 /
Connection:即连接, 与你日常理解的连接没有什么不同,比如 redis的连接,mysql的连接
Channel:即通道, 可以理解为一个连接中的子通道,想象一条高速公路,可能是 4车道的,也可能是 8 车道的,这些车道就是 Channel。
Exchange : 交换机,如果你知道交换机设备的话,它的原理跟交换机是基本一样的。
routingkey : 用来绑定交换机和队列的一个字符串。发送消息时需要指定 routingKey, 绑定了此 routingKey的队列将接收到此消息。
queue队列: 消息经过交换机,最终发送到队列中。
发布消息
<?php
$conn = [
// Rabbitmq 服务地址
'host' => '127.0.0.1',
// Rabbitmq 服务端口
'port' => '',
// Rabbitmq 帐号
'login' => 'admin',
// Rabbitmq 密码
'password' => 'admin',
'vhost'=>'/'
]; //创建连接和channel
$conn = new AMQPConnection($conn);
if(!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn); // 用来绑定交换机和队列
$routingKey = 'key_1'; $ex = new AMQPExchange($channel);
// 交换机名称
$exchangeName = 'ex1';
$ex->setName($exchangeName); // 设置交换机类型
$ex->setType(AMQP_EX_TYPE_DIRECT);
// 设置交换机是否持久化消息
$ex->setFlags(AMQP_DURABLE);
$ex->declare(); for($i=; $i<; ++$i){
echo "Send Message:".$ex->publish(date('H:i:s')."用户".$i."注册" , $routingKey )."\n";
} #设置消息持久化,特别注意 array('delivery_mode'=>2, 'priority'=> 9)
#设置了持久化,消息是放在硬盘,而不是内存,非持久化则相反
echo "Send Message:".$ex->publish(date('H:i:s')."用户".$i."注册" , $routingKey,AMQP_DURABLE,array('delivery_mode'=>2, 'priority'=> 9))."\n";
以上代码保存为 send.php。
消费消息
<?php
$conn = [
// Rabbitmq 服务地址
'host' => '127.0.0.1',
// Rabbitmq 服务端口
'port' => '5672',
// Rabbitmq 帐号
'login' => 'admin',
// Rabbitmq 密码
'password' => 'admin',
'vhost'=>'/'
]; //创建连接和channel
$conn = new AMQPConnection($conn);
if(!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);
$exchangeName = 'ex1'; //创建交换机
$ex = new AMQPExchange($channel);
$ex->setName($exchangeName); $ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型
$ex->setFlags(AMQP_DURABLE); //持久化
$ex->declare(); // 创建队列
$queueName = 'queue1';
$q = new AMQPQueue($channel);
$q->setName($queueName);
$q->setFlags(AMQP_DURABLE);
$q->declareQueue(); // 用于绑定队列和交换机,跟 send.php 中的一致。
$routingKey = 'key_1';
$q->bind($exchangeName, $routingKey); //接收消息
$q->consume(function ($envelope, $queue) {
$msg = $envelope->getBody();
echo $msg."\n"; //处理消息
}, AMQP_AUTOACK); $conn->disconnect();
以上代码保存为 consume.php。
运行代码
一开始队列是不存在的,我们需要先启动 consume.php 来初始化队列,打开终端,运行
php consume.php
启动后 , php consume.php 将阻塞监听队列消息。
然后打开新终端窗口运行:
php send.php
然后在新 consume.php 所在的终端窗口将看到接收到的消息。

[转载]PHP 连接 Rabbitmq 实例代码的更多相关文章
- 【js学习】js连接RabbitMQ达到实时消息推送
js连接RabbitMQ达到实时消息推送 最近在自己捯饬一个网站,有一个功能是需要后端处理完数据把数据发布到MQ中,前端再从MQ中接收数据.但是前端连接MQ又成了一个问题,在网上搜了下资料,点进去一篇 ...
- Python连接MySQL的实例代码
Python连接MySQL的实例代码 MySQLdb下载地址:http://sourceforge.net/projects/mysql-python/ 下载解压缩后放到%Python_HOME% ...
- PHP使用RabbitMQ实例
相关博文:CentOS6.9安装RabbitMQ和源码编译安装php的RabbitMQ扩展RabbitMQ入门基础CentOS7源码编译安装nginx+php7.2+mysql5.7并使用system ...
- Node.js连接RabbitMQ,断线重连,动态绑定routing key
RabbitMQ官方提供的教程https://www.rabbitmq.com/tuto...,是基于回调的. 下面将给出基于Promise式的写法.并且实现动态的队列绑定 初始化配置 const a ...
- PHP读取超大文件的实例代码
数据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机 去年年底的各种网站帐号信息的数据库泄漏,很是给力啊,趁机也下载了几个数据库,准备学学数据分析家来分析一 ...
- iOS 蓝牙开发(二)iOS 连接外设的代码实现(转)
转载自:http://www.cocoachina.com/ios/20150917/13456.html 原文作者:刘彦玮 上一篇文章介 绍了蓝牙的技术知识,这里我们具体说明一下中心模式的应用场景. ...
- 远程连接RabbitMQ失败
远程连接RabbitMQ失败 为了避免污染宿主系统环境,于是在虚拟机中搭建了一个linux环境并且按照了rabbitmq-server.然后在远程连接的时候一直连接失败. 官网上面给的例子都是在本地使 ...
- 【甘道夫】HBase(0.96以上版本号)过滤器Filter具体解释及实例代码
说明: 本文參考官方Ref Guide,Developer API和众多博客.并结合实測代码编写.具体总结HBase的Filter功能,并附上每类Filter的对应代码实现. 本文尽量遵从Ref Gu ...
- .NET(C#)连接各类数据库代码-集锦
1.C#连接连接Access 复制代码代码如下: using System.Data; using System.Data.OleDb; .. string strConnection=& ...
随机推荐
- eclipse Git配置
Git 1:选择git 2:下载对应版本 安装 Git常用命令: 显示信息类命令 git ls-files -u 显示冲突的文件,-s是显示标记为冲突已解决的文件 git diff 对比工作区和st ...
- 算法笔记--java的BigInteger类及BigDecimal类
引包:import java.math.*; BigInteger类: 可以使用构造方法:public BigInteger(String val),或者valueOf(int)函数,如: BigIn ...
- 关于React性能优化
这几天陆陆续续看了一些关于React性能优化的博客,大部分提到的都是React 15.3新加入的PureComponent ,通过使用这个类来减少React的重复渲染,从而提升页面的性能.使用过Rea ...
- C# 中的集合(Array/ArrayList/List<T>/HashTable/Dictionary)
int [] numbers = new int[5]; // 长度为5,元素类型为 int. string[,] names = new string[5,4]; // 5*4 的二维数组 byte ...
- [Java学习] 再谈Java包
在Java中,为了组织代码的方便,可以将功能相似的类放到一个文件夹内,这个文件夹,就叫做包. 包不但可以包含类,还可以包含接口和其他的包. 目录以"\"来表示层级关系,例如 E:\ ...
- BeanShell使用json.jar包处理Json数据
环境准备 ①Jmeter版本 ,JDK ②前置条件:将json.jar包置于..\lib\下, 如果还是报错,可以将该jar包添加到测试计划的Library中:否则会报:Typed variable ...
- Linux下安装Phantomjs
1. 安装linux系统的软件包 先来看一下官方网站的提示: Note: For this static build, the binary is self-contained. There is n ...
- 原生js实现倒计时
html代码: <div class="box">距离下班还有:<span>01:01:30</span></div> css代码: ...
- .NET 性能优化方法总结==转
.NET 性能优化方法总结 目录 目录 1. C#语言方面... 4 1.1 垃圾回收... 4 1.1.1 避免不必要的对象创建... 4 1.1.2 不要使用空析构函数 ★... 4 1.1.3 ...
- Ubuntu中使用WPS
ubunu系统下用WPS办公软件比较好,比较兼容MS office, ubuntu下WPS相关命令有:et,wps,wpp. 使用Ctrl+Alt+T打开命令端, "et"命令可以 ...