当前位置: 首页 > 后端技术 > PHP

php-amqplib库操作RabbitMQ

时间:2023-03-29 17:19:57 PHP

mq的安装和php扩展在另一篇文章RabbitMQ的基本原理中说明首先,建议对RabbitMQ(以下简称mq)的基本工作原理有一个大概的了解,你可以参考本文最重要的部分,几个对象如下。对象名borker相当于mqserverchannelchannel或者channelexchangequeuequeuevhost虚拟主机(用于项目队列隔离)。这些对象在上面的文章中已经描述的很清楚了,这里就不再赘述了。安装运行库在你项目目录下的composer.json文件中添加如下内容{"require":{"php-amqplib/php-amqplib":"2.7.*"//添加这一行}}然后执行composer更新php-amqplib/php-amqplib。如果你的项目已经有composer.json,更方便的方法是执行composerrequirephp-amqplib/php-amqplib,直接安装即可。示例演示首先需要定义交换机、队列和路由键(routingkey)如下是示例代码conf=['host'=>'127.0.0.1','port'=>5672,'user'=>'kd_dev','pwd'=>'kd_dev','vhost'=>'/',];$exchangeName='kd_sms_send_ex';//交换名称$queueName='kd_sms_send_q';//队列名称$routingKey='sms_send';//Routingkey(也可以省略)$conn=newAMQPStreamConnection(//建立producer和mq的连接$conf['host'],$conf['port'],$conf['user'],$conf['pwd'],$conf['vhost']);$channel=$conn->channel();//在连接Inter-channel的基础上建立producer和mq的连接$channel->exchange_declare($exchangeName,'direct',false,true,false);//声明初始化开关$channel->queue_declare($queueName,false,true,false,false);//声明初始化一个队列$channel->queue_bind($queueName,$exchangeName,$routingKey);//将队列绑定到交换器并使用路由关键字$msgBody=json_encode(["name"=>"iGoo","age"=>22]);$msg=newAMQPMessage($msgBody,['content_type'=>'text/plain','delivery_mode'=>2]);//生成消息$r=$channel->basic_publish($msg,$exchangeName,$routingKey);//将消息推送到交换$channel->close();$conn->close();有几个地方需要注意:$routingKey其实可以省略,但是一般是为了交换机推送消息到不同的队列方便。如果在绑定的时候使用了$routingKey,那么在bashic_publish的时候也必须指定$routingKey。否则交换机无法路由到指定的队列,默认会被推送到不使用关键字的队列(这是我实验时遇到的坑)。上面的exchange_declare、queue_declare、queue_bind其实不是必须的,如果在代码运行前通过管理后台手动把这行switch和queue名称添加到mq中,那么不需要上面三行就可以执行使用了的代码。执行以上代码后,在mq管理后台也可以看到相应的显示。如下图,添加的交换机显示添加的队列,显示队列与交换机的绑定关系,绑定的路由关键字routing匹配。在上面的代码中,当我们声明初始化开关时,第二个参数使用的是直接参数。事实上,还有3个其他参数可供选择。分别讲解规则,指导扇出直播的精准推送。推送到绑定到此交换机的所有队列主题多播。比如我上面绑定的关键字是sms_send,那么就可以推送到*.sms_send的所有队头。我不知道怎么推。下篇文章将简单演示客户端如何消费queue---update---update创建switch和queue时常用参数的说明name:$queue//在fanoutexchange中应该是唯一的。[queuename]passive:false//不检查是否存在同名队列[是否检测同名队列]durable:false//队列不会在服务器重启后存活[是否启用队列持久化]exclusive:false//队列可能被其他通道访问[队列是否可以被其他队列访问]auto_delete:true//通道关闭后队列将被删除。[通道关闭后是否删除队列]name:$exchange[exchangename]type:direct[routetype]passive:false[]durable:true[是否开启exchange持久化]auto_delete:false//the通道关闭后交换不会被删除。