目前我在PHP里接触实现RabbitMQ的方式有两种,一种是通过amqp扩展,一种是使用php-amqplib,本章讲诉RabbitMQ的安装及amqp扩展及amqp扩展如何实现RabbitMQ

环境: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扩展实现(四)相关推荐

  1. windows环境PHP使用RabbitMq安装amqp扩展

    一.先查看自己PHP版本及配置信息,可以在命令行用 php -i 查询,或者查看phpinfo(); 找出下面几个信息,根据这个信息选择对应的DLL文件. 二.下载扩展对应的dll文件 PHP的版本对 ...

  2. linux安装RabbitMQ和amqp扩展(这个安装rabbitmq通过了但是代码测试没有通过)

    消息队列rabbitmq RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统,底层基于Erlang语言. 一:centos7安装RabbitMQ 这玩意儿安装很扯淡,官方推荐rpm安装 ...

  3. php的amqp扩展 安装(windows) rabbitmq学习篇

    因为RabbitMQ是由erlang语言实现的,所以先要安装erlang环境 erlang 下载安装 http://www.erlang.org/download.html rabbitmq 下载安装 ...

  4. 17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 作者:28cm不含头(来自:知乎) 原文链接: https://www.zhihu.com/qu ...

  5. rabbit以及php amqp扩展使用

    来源:https://blog.51cto.com/chinalx1/2150793 一定要注意php安装AMQP的版本,版本不同使用的方法不一样.在官方网站就有2个版本的AMQP 第一版本:xxx, ...

  6. activemq后台管理 看topic消息_17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列...

    作者:28cm不含头(来自:知乎) 原文链接: https://www.zhihu.com/question/43557507 一.资料文档 二.开发语言 三.支持的协议 四.消息存储 五.消息事务 ...

  7. 消息中间件学习总结(16)——17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列

    本文将从,Kafka.RabbitMQ.ZeroMQ.RocketMQ.ActiveMQ 17 个方面综合对比作为消息队列使用时的差异. 一.资料文档 Kafka:中.有kafka作者自己写的书,网上 ...

  8. Python中RabbitMQ的使用

    Python中RabbitMQ的使用 文章目录 Python中RabbitMQ的使用 一.AMQP协议 1.工作过程 2.细节问题 3.Exchange交换机 主题交换机: 4.Queue队列 5.C ...

  9. 安装rabbitmq和php扩展

    一.安装rabbitmq服务端 1.安装erlang 试了几次erlang官方的包安装后,在安装rabbitmq时都报错要依赖R14B02,干脆使用rabbitmq官方提供的包:https://git ...

最新文章

  1. 图像处理:灰度(级)和分辨率
  2. 勒索病毒入侵中国, Splunk建议网络立即进行区分和隔离设置
  3. 百度地图java批量获得经纬度_从百度地图API接口批量获取地点的经纬度
  4. 联想拯救者Legion Y7000P 2020款(10代INTEL+GTX1650)安装ubuntu16.04(双系统)
  5. 【SQL Server 优化性能的几个方面】(转)
  6. component组件基础
  7. 大数据工程师简历怎么写,更受到HR青睐?
  8. 80x86汇编小站站长简单介绍-2014年08月23日
  9. 沧小海读《图解TCP/IP》笔记——第一章 网络基础知识
  10. cpu功耗排行_2019.10.31性能和功耗CPU显卡天梯图
  11. LinkedIn高级分析师王益:大数据时代的理想主义和现实主义(图灵访谈)
  12. 视频字幕API接口文档
  13. [kubernetes]-weave scope初体验
  14. 深度学习之动态调整学习率LR
  15. 如何选择有效的CRM软件解决方案
  16. 微信小程序视频点播在线视频学习系统 毕业设计 课程设计(5)视频播放页面
  17. 2022软件工程师薪资报告出炉!
  18. Mahout之——mahout0.9注意事项SlopeOneRecommender
  19. 【读薄 CSAPP】贰 机器指令与程序优化
  20. Python函数:np.sum()以及axis=0、axis=1用法

热门文章

  1. 饮用水中的氟化物超标怎么去除、除氟工艺介绍
  2. 数美科技斩获36氪“WISE 2020数据智能最佳解决方案”
  3. 微信小程序 | 基于云数据库的许愿墙
  4. Kali linux 2016.2(Rolling)中的payloads模块详解
  5. 胡子哥 观察日记 2020年10月5日(周一)
  6. 牛逼,前阿里 P7 技术专家!
  7. 什么是ACCESS端口?此端口如何处理数据帧?
  8. 书籍 | 《黑天鹅》事件
  9. 【总结】线性代数的本质 - 2
  10. echarts找到china地图( npm i --save echarts/map/js/China)