RabbitMQ在PHP使用,我在这里对RabbitMQ的各项方法和参数进行了一些梳理,有不足的地方还望各位大神指点.

想要使用rabbitMQ消息队列,首先需要安装 php_amqp.dll 扩展 和 rabbitMQ 服务, 至于怎么安装大家可以百度一下,这类的资料还是有很多的.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
RabbitMQ的工作原理大概如下:
生产者:生产消息--->创建交换器:对消息进行routekey鉴别,然后分发到相对应的队列---->队列:通过routekey,装载消息,然后运输给消费者-->消费者:接收队列传送的消息,进行处理,然后给予回应.

下面是RabbitMQ生产者实现的简单代码:
<?php
$exchangeName = 'ceshi1';
$queueName = 'ceshi_queue1';
$str = 'ceshi'.rand(1,9999);
$routeKey = 'ceshi_queue1';
$message = $str; $connection = new AMQPConnection(array('host' => '', 'port' => '', 'vhost' => '', 'login' => '', 'password' => ''));
$connection->connect() or die("Cannot connect to the broker!\n"); # 连接服务
$channel = new AMQPChannel($connection);
# 创建交换器
$exchange = new AMQPExchange($channel);
# 设置交换器的名称
$exchange->setName($exchangeName);
# 设置多个参数值[setArguments ( array $arguments )];
# 获取该队列某个参数的信息 , getArgument ( string $key )
# [如果无法将此交换机的消息路由,则将它们发送到这里指定的备用交换机。(设置“alternate-exchange”参数)。]
# 设置交换器类型
# AMQP_EX_TYPE_DIRECT[点对点],AMQP_EX_TYPE_FANOUT[广播],AMQP_EX_TYPE_TOPIC[模糊匹配],AMQP_EX_TYPE_HEADER[头匹配]
$exchange->setType(AMQP_EX_TYPE_DIRECT);
# 交换器持久化
//$exchange->setFlags(AMQP_DURABLE);
# 执行创建交换器
$exchange->declareExchange();
# 创建队列
$queue = new AMQPQueue($channel);
$queue->setName($queueName);
# 设置单个指定的参数键值,setArgument ( string $key , mixed $value )
# 获取该队列某个参数的信息 , getArgument ( string $key )
//$queue->setArgument();
# [发布到队列中的消息可以在被丢弃之前生存多长时间(毫秒(设置x-message-ttl)参数。]
# [在自动删除队列(毫秒)之前,该队列不能被使用多长时间。(设置“x-expires”参数)。]
# [队列中有多少(准备好的)消息[个数],可以在它开始,从其头上删除之前包含。(设置x-max-length长度)参数]
# [准备好的消息的总大小,队列可以在它开始从头上删除之前包含。(设置x-max-length-bytes 纵向字节)参数]
# [如果拒绝或过期消息将被重新发布的Exchange的可选名称。(设置“x-dead-letter-exchange”参数,[交换器名,(string)])。]
# [可选的替换路由密钥,当消息已被写入字母时使用。如果未设置此消息,将使用消息的原始路由密钥。(设置“x-dead-letter-routing-key”参数)。]
# [支持队列的最大优先级数量;如果未设置,队列将不支持消息优先级。(设置x-max-priority)参数。]
# [将队列设置为懒惰模式,尽可能保留磁盘上的尽可能多的消息以减少RAM的使用;如果没有设置,队列将保持内存中的缓存以尽可能快地传递消息。(设置“x-queue-mode”参数设置:lazy)。]
# [将队列设置为主定位模式,确定在节点群集上声明队列主控器所处的规则。(设置x-queue-master-locator 参数。]
# 设置多个参数值[setArguments ( array $arguments )];
# 获取该队列所有参数的信息 , getArguments ( void )
//$queue->setArguments();
# 持久化队列
# AMQP_DURABLE[队列持久], AMQP_PASSIVE[返回消息计数], AMQP_EXCLUSIVE[只被一个连接(connection)使用,而且当连接关闭后队列即被删除], AMQP_AUTODELETE[当最后一个消费者退订后即被删除].
$queue->setFlags(AMQP_DURABLE);
# 执行创建队列
$queue->declareQueue(); # 开启事务,确保数据真正不丢失
$channel->startTransaction();
# 将消息和标识绑定到交换器中
# publish(message[消息],route_key,[ flags[ AMQP_MANDATORY,AMQP_IMMEDIATE],attributes[array] ]);
# attributes 存有参数 => [content_type(用于描述MIME类型的编码。例如,对于经常使用的JSON编码,将此属性设置为 “application/json” 是一个很好的做法。),
#content_encoding,message_id,user_id,app_id,delivery_mode[2 消息持久,1非持久],priority,timestamp,expiration,type,reply_to(主要用于命名一个回调队列 ) ]
$exchange->publish($message,$routeKey);
$channel->commitTransaction();
var_dump("[x] Sent $message"); # 关闭连接
$connection->disconnect(); ?>
以上是生产者的简单代码,下面我们可以看看消费者的简单代码:
<?php
$exchangeName = 'ceshi1';
$queueName = 'ceshi_queue1';
$routeKey = 'ceshi_queue1'; $connection = new AMQPConnection(array('host' => '', 'port' => '', 'vhost' => '', 'login' => '', 'password' => ''));
$connection->connect() or die("Cannot connect to the broker!\n"); # 连接服务
$channel = new AMQPChannel($connection);
$exchange = new AMQPExchange($channel);
$exchange->setName($exchangeName);
# 设置交换器类型
$exchange->setType(AMQP_EX_TYPE_DIRECT);
# 交换器持久化
//$exchange->setFlags(AMQP_DURABLE);
$exchange->declareExchange(); $queue = new AMQPQueue($channel);
$queue->setName($queueName);
$queue->setFlags(AMQP_DURABLE);
$queue->declareQueue(); # 队列根据routekey 装载消息
$queue->bind($exchangeName,$routeKey);
var_dump('[*] Waiting for messages. To exit press CTRL+C');
#
$queue->consume('callback');
# 设置每次只能处理一条,避免消息堆积,从而导致队列挂掉
$channel->qos(0,1);
#关闭连接
$connection->disconnect(); function callback($envelope, $queue) {
$msg = $envelope->getBody();
// var_dump(" [x] Received:" . $msg);
echo $msg."\n";
// # nack 让没有通过的消息可以 再次进入队列, ack 没有通过的消息不能再次回到队列中
// # 通知队列消息通过,可以执行下一个消息
$queue->nack($envelope->getDeliveryTag());
}
?>

 
这些代码都是在网上收集的,我个人在附加了一些方法和参数的使用方法,希望能帮到各位,谢谢!!!!


PHP中使用RabiitMQ---各项参数的使用方法的更多相关文章

  1. VS2013中带命令行参数的调试方法---C++

    今天先记录一下(也是传说中大神喜欢装逼的comment line)c++中向主函数int main(int argc,char** argv )传递4中方法,欢迎添加新方法, 然后可以参考别人写的很好 ...

  2. <django中render_to_response的可选参数和使用方法>

    在django官方文档中有比较详细的介绍,在此我按照自己的理解适当的阐述一下: return render_to_response(①'my_template.html', ②my_data_dict ...

  3. 【Java学习笔记之二十七】Java8中传多个参数时的方法

    java中传参数时,在类型后面跟"..."的使用:        public static void main(String[] args){       testStringA ...

  4. MySQL中limit使用动态参数的解决方法(拼接SQL字符串语句来执行SQL)

    官方好像说过limit已经在5.6版本上支持了动态参数,但是测试时依然还是不行. 那么要解决limit动态参数唯一能做的就是使用字符串SQL拼接的形式,然后再进行执行. 一般有以下方式解决: 1.存储 ...

  5. 织梦后台系统设置在PHP5.4环境中不能保存中文参数的解决方法

    在没用PHP5.4的环境做Dede后台的时候,织梦58一直没有遇到这个问题,昨天上传一个新的模版到空间去测试发现后台的系统基本参数设置中所有的中文内容都无法保存,关于这个问题,其实以前也听说过,知识一 ...

  6. vue v-show与v-for同时配合v-bind使用并在href中传递多个参数的使用方法

    最近在项目中,因为还没使用前端构建工具,还在使用vue+jquery方法渲染页面 碰到几个小问题,在此记录下作为vue学习之路上的一个小知识点 需求:1.数据列表存在与否状态,没有数据显示默认提示,有 ...

  7. .net中MVC Webapi多参数调用控制器方法

    http://blog.csdn.net/wulex/article/details/71545471 路由 public static void Register(HttpConfiguration ...

  8. sql 解析字符串添加到临时表中 sql存储过程in 参数输入

    sql 解析字符串添加到临时表中  sql存储过程in 参数输入 解决方法 把字符串解析 添加到 临时表中 SELECT * into #临时表   FROM dbo.Func_SplitOneCol ...

  9. 细说javascript 中的 window.open() 参数设置

    今天遇到一个问题,就是要用javascript中的window.open()打开一个新的网页,而且新打开的网页要在原来网页的基础之上,在查了一些资料之后,找到里一下方法:(其中,url 为链接的地址) ...

随机推荐

  1. C#中的基础数据类型

    一.C#有15个预定义类型,13个值类型,两个引用类型(string和object): 1.整型 int a=15; short a=15; 2.浮点类型 float a=12.9; double a ...

  2. LeetCode5 最长回文子串

    最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" ...

  3. EasingAnimation

    EasingAnimation https://github.com/YouXianMing/EasingAnimation This class is used for Easing animati ...

  4. Python学习---Django误删除sql表后,如何创建数据

    误删除sql表后,怎么创建数据? 仅仅适合单表,多表因为涉及约束, python mangage.py makemigrations  --> 生成migrations目录和根数据库对应的sql ...

  5. phpstrom设置php环境

    phpstorm设置自动同步服务器 Tools->Deployment->Confinguration 点+号,添加服务器,类型SFTP,输入name 点击ok,项目与服务器连接成功! 设 ...

  6. Android studio ocr初级app开发问题汇总(含工程代码)

    博客第一篇文章,稍作修改,增加文字介绍 开发目的 最近由于某些需求,需要在Android手机端实现OCR功能,大致为通过手机照相,识别出相片中的中文信息字段.但是由于新手光环+流程不熟悉,遇到了各种各 ...

  7. Debian下Cannot set LC_CTYPE to default locale: No such file or directory解决方法

    把语言环境变量改为英文 将Ubuntu系统语言环境改为英文的en_US.UTF-8 查看当前系统语言环境 locale 编辑配置文件,将zh_US.UTF-8改为en_US.UTF-8,zh改为en ...

  8. programming-languages学习笔记--第6部分

    programming-languages学习笔记–第6部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} program ...

  9. [19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)

    一.工厂模式(分为:简单工厂模式.工厂方法模式.抽象工厂模式) 实现了创建者和调用者的分离 核心本质:1.实例化对象,用工厂方法代替new操作:2.将选择实现类.创建对象统一管理和控制,从而将调用者跟 ...

  10. 《metasploit渗透测试魔鬼训练营》靶机演练之第五章实战案例KingView 6.53版本CVE-2011-0406漏洞

    在一个笔记本上开两个虚拟机有点卡,而且太麻烦,就把metasploit的目标靶机放在别的机器上了,ip自己配置了一下, 目标主机:192.168.137.254 入侵机:192.168.137.253 ...