PHP中RabbitMQ之amqp扩展实现(四)
环境:CoentOS,PHP 7
1、RabbitMQ的安装
需要下载的两个包
erlang-21.0.7-1.el7.centos.x86_64.rpm
rabbitmq-server-3.7.7-1.el7.noarch.rpm
这两个包我已经放在了百度云盘的分享上
链接:https://pan.baidu.com/s/1rMv_yFpLnH-D1S5wrOZrbA#list/path=%2FRabbitMQ
提取码:ipyu
然后参照 weixin_41368339的博客linux rabbitmq3.7.7安装与使用一文中的步骤安装步,基本上没有什么问题
2、amqp扩展的安装
这个请参照一只猪儿虫的linux 编译安装amqp一文中的步骤安装,也没有什么问题
当安装成功之后,即可开始用amqp实现RabbitMQ了
3、Demo示例
在安装完成后我们就可以开始我们的RabbitMQ之旅了,本Demo示例只创建了一个直连交换机,共有四个文件Consum.php (消费者),Publish.php (生产者) ,RabbitMqParernt.php (自己封装的RabbitMQ的方法) ,以及test.php (测试数据)
RabbitMqParernt.php如下所示
- <?php
- abstract class RabbitMqParernt
- {
- //rabbitMQ配置信息(默认配置)
- public $config = array(
- 'host'=>'127.0.0.1', //host
- 'port'=>5672, //端口
- 'username'=>'guest', //账号
- 'password'=>'guest', //密码
- 'vhost'=>'/' //虚拟主机
- );
- public $exchangeName = ''; //交换机
- public $queueName = ''; //队列名
- public $routeKey = ''; //路由键
- public $exchangeType = ''; //交换机类型
- public $channel; //信道
- public $connection; //连接
- public $exchange; //交换机
- public $queue; //队列
- //初始化RabbitMQ($config数组是用来修改rabbitMQ的配置信息的)
- public function __construct($exchangeName, $queueName, $routeKey, $exchangeType = '',$config = array())
- {
- $this->exchangeName = $exchangeName;
- $this->queueName = $queueName;
- $this->routeKey = $routeKey;
- $this->exchangeType = $exchangeType;
- if(!empty($config))
- {
- $this->setConfig($config);
- }
- $this->createConnet();
- }
- //对RabbitMQ的配置重新进行配置
- public function setConfig($config)
- {
- if (!is_array($config))
- {
- throw new Exception('config不是一个数组');
- }
- foreach($config as $key => $value)
- {
- $this->config[$key] = $value;
- }
- }
- //创建连接与信道
- public function createConnet()
- {
- //创建连接
- $this->connection = new AMQPConnection($this->config);
- if(!$this->connection->connect())
- {
- throw new Exception('RabbitMQ创建连接失败');
- }
- //创建信道
- $this->channel = new AMQPChannel($this->connection);
- //创建交换机
- $this->createExchange();
- //生产时不需要队列,故队列名为空,只有消费时需要队列名
- if(!empty($this->queueName))
- {
- $this->createQueue();
- }
- }
- //创建交换机
- public function createExchange()
- {
- $this->exchange = new AMQPExchange($this->channel);
- $this->exchange->setName($this->exchangeName);
- $this->exchange->setType(AMQP_EX_TYPE_DIRECT);
- $this->exchange->setFlags(AMQP_DURABLE);
- }
- //创建队列,绑定交换机
- public function createQueue()
- {
- $this->queue = new AMQPQueue($this->channel);
- $this->queue->setName($this->queueName);
- $this->queue->setFlags(AMQP_DURABLE);
- $this->queue->bind($this->exchangeName, $this->routeKey);
- }
- public function dealMq($flag)
- {
- if($flag)
- {
- $this->queue->consume(function($envelope){$this->getMsg($envelope, $this->queue);},AMQP_AUTOACK);//自动ACK应答
- }
- else
- {
- $this->queue->consume(function($envelope){$this->processMessage($envelope, $this->queue);});
- }
- }
- public function getMsg($envelope, $queue)
- {
- $msg = $envelope->getBody();
- $this->doProcess($msg);
- }
- public function processMessage($envelope, $queue)
- {
- $msg = $envelope->getBody();
- $this->doProcess($msg);
- $queue->ack($envelope->getDeliveryTag()); //手动发送ACK应答
- }
- //处理消息的真正函数,在消费者里使用
- abstract public function doProcess($msg);
- //发送消息
- public function sendMessage($message)
- {
- $this->exchange->publish($message, $this->routeKey);
- }
- //关闭连接
- public function closeConnect()
- {
- $this->channel->close();
- $this->connection->disconnect();
- }
- }
Consum.php 如下所示
- <?php
- include_once('RabbitMqParernt.php');
- class Consum extends RabbitMqParernt
- {
- public function __construct()
- {
- parent::__construct('exchange', 'queue', 'routeKey');
- }
- public function doProcess($msg)
- {
- echo $msg;
- }
- }
- $consum = new Consum();
- //$consum->dealMq(false);
- $consum->dealMq(true);
Publish.php如下所示
- <?php
- include_once('RabbitMqParernt.php');
- class Publish extends RabbitMqParernt
- {
- public function __construct()
- {
- parent::__construct('exchange', '', 'routeKey');
- }
- public function doProcess($msg)
- {
- }
- }
test.php如下所示
- <?php
- include_once('Publish.php');
- $publish = new Publish();
- $publish->sendMessage('Hello,World!');
- $publish->closeConnect();
4、添加交换机与队列
打开http://ip(你的RabbitMQ安装的主机):15672/,会进入到RabbitMQ的可视化管理后台登录页面,登录你的账号密码(如果你是按照第一步提到的博客里的教程来装的,那你的账号密码就是guest),然后新加交换机和队列,
以下是新加交换机的操作,注意vhost与以及交换机的名称要与代码里的消费者与生产者传入的参数值保持一致,如果你不想使用"/"这个默认的vhost,也可以新建一个vhost(什么?你问我如何新建,那么请百度一下),但是要记住在代码里创建消费者与生产者时把你新加的这个vhost传进去,覆盖RabbitMqParernt.php里的vhost
以下是新加队列,这里的vhost要与上一步的vhost保持一致,保证交换机与队列在同一个vhost下,不然交换机会找不到队列的,队列名与消费者代码里传入进去的队列名保持一致
5、运行代码
然后我们在一个窗口先启动消费者
在另外一个窗口运行test.php文件
出现这个生产者发布的hello,world!就成功了
注意:消费者与生产者传入的交换机名称,路由键必须相同
交换机类型请务必选择直连,各种交换机的路由键形式不大相同,有兴趣的同学可以去试试其它类型的交换机实现哦
当修改了vhost或者交换机名称,队列名称等时,需要修改对应代码
至于注释里的ack应答,我会在之后的博客里详细介绍,包括RabbitMQ的持久化,这里使用默认的ack应答即可
对于amqp的拓展的使用,大家也可以去研究一下
关于管理后台及RabbitMQ的命令,我这里就不多介绍了,有兴趣的同学去网上搜索一下就能搜到好多
下一篇:RabbitMQ的持久化(六)
PHP中RabbitMQ之amqp扩展实现(四)的更多相关文章
- 用PHP尝试RabbitMQ(amqp扩展)实现消息的发送和接收
消费者:接收消息 逻辑:创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息 <?php /********* ...
- windows下安装rabbitmq的php扩展amqp(原创)
从php官方下载相应的版本http://pecl.php.net/package/amqp,我这里使用的是1.4.0版本(http://pecl.php.net/package/amqp/1.4.0/ ...
- (五)RabbitMQ消息队列-安装amqp扩展并订阅/发布Demo(PHP版)
原文:(五)RabbitMQ消息队列-安装amqp扩展并订阅/发布Demo(PHP版) 本文将介绍在PHP中如何使用RabbitMQ来实现消息的订阅和发布.我使用的系统依然是Centos7,为了方便, ...
- php的amqp扩展 安装(windows) rabbitmq学习篇
因为RabbitMQ是由erlang语言实现的,所以先要安装erlang环境erlang 下载安装 http://www.erlang.org/download.htmlrabbitmq 下载安装 h ...
- centos7 安装rabbitmq rabbitmq-c以及amqp扩展 详细篇
自己鼓捣了一晚上总算整明白了,有几个坑分享给小伙伴,希望能帮到你 前期准备 安装erlang 下载rpm包地址:https://github.com/rabbitmq/erlang-rpm (注意er ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (一) -- 安装 AMQP 扩展和 Direct Exchange 模式
Windows 安装 amqp 扩展 RabbitMQ 是基于 amqp(高级消息队列协议) 协议的.使用 RabbitMQ 前必须为 PHP 安装相应的 amqp 扩展. 下载相应版本的 amqp ...
- iOS8中添加的extensions总结(四)——Action扩展
Action扩展 注:此教程来源于http://www.raywenderlich.com的<iOS8 by Tutorials> 1.准备 本次教程利用网站bitly.com进行 bit ...
- 17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列
原文:https://mp.weixin.qq.com/s/lpsQ3dEZHma9H0V_mcxuTw 一.资料文档 二.开发语言 三.支持的协议 四.消息存储 五.消息事务 六.负载均衡 七.集群 ...
- 综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列
来源:http://t.cn/RVDWcfe 一.资料文档 Kafka:中.有kafka作者自己写的书,网上资料也有一些.rabbitmq:多.有一些不错的书,网上资料多.zeromq:少.没有专门写 ...
随机推荐
- microsoft 官方学习资源
https://devblogs.microsoft.com/dotnet/ :_NET Blog https://docs.microsoft.com/zh-cn/learn/ :Microsof ...
- [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)
1 Floyd算法 1.1 解决问题/提出背景 多源最短路径(带权有向图中,求每一对顶点之间的最短路径) 方案一:弗洛伊德(Floyd算法)算法 算法思想:动态规划法 时间复杂度:O(n^3) 形式上 ...
- DrawRect 内存问题
DrawRect实现画板将会大量产生内存问题. 具体请看:http://bihongbo.com/2016/01/03/memoryGhostdrawRect/ 可能的原因有两个: 一是在手指绘制的过 ...
- Elasticsearch删除数据操作,你必须知道的一些坑
前两天有同事打电话问我,说ES删除数据有没有什么坑? 我当时就问,是删索引还是删索引里的数据?她回答说是删数据,我说查出这些数据直接删除就好了,没有什么坑... 后来想想,关于ES数据的删除,之前确实 ...
- python-Web-flask-路由和视图
1 路由和视图: 简介: Flask框架包含两个核心:Werkzeug工具箱,Jinja2模板引擎 flask: 提供基本功能,属于轻量级 django: 提供相对完整功能,重量级 搭建虚拟环境 He ...
- django 之(二) --- 源码分析
CBV类视图继承 CBV:继承自View:注册的时候使用的as_view() 入口 不能使用请求方法的名字作为参数的名字 只能接受已经存在的属性对应的参数 定义了一个view 创建了一个类视图对象 保 ...
- ajax提交文件,django测试脚本环境书写,froms组件,钩子函数
1.在新版本中,添加app是直接在settings设置中,将INSTALLED_APPS里添加app名字, 但是他的完整写法是 'app01.apps.App01Config' 因为新版本做了优 ...
- 使用请求包装器RequestWrapper 对博客内容进行编码
1.写一个文章类 代码如下 package model; public class article { private int id; private String title; private St ...
- docker入门2--生命周期
容器的概念: 一句话概括容器:容器就是将软件打包成标准化单元,以用于开发.交付和部署. 容器镜像是轻量的.可执行的独立软件包 ,包含软件运行所需的所有内容:代码.运行时环境.系统工具.系统库和设置 ...
- 一个自己稍作修改了的美赛论文 LaTeX 模板
警告:这是旧版模板的发布页面.本站已经发布了最新版的美赛模板 easymcm(2020 年美赛可用),请到该页面查看: https://www.cnblogs.com/xjtu-blacksmith/ ...