多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
**MQ的主要应用场景** 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时。 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单。 场景三:过1分钟给新注册会员的用户,发送注册邮件等。 场景四:电商ERP系统下载订单之后,通知仓库锁定库存等。 ....各种延迟场景。 我在架构分布式的应用场景的时候使用的PHP方案 RabbitMQ。MQ里头的各种概念就不跟大家扯淡了,这个意义不大。 RabbitMQ的特性,简介,安装我就不说了,这个如果有需要,大家留言,我可以专门开一个文章来写。 PHP下RabbitMQ扩展的安装 PHP里头要使用rabbitmq,得先安装 amqp扩展,这个玩意儿windows的名字叫:php\_amqp.dll. 下载地址:http://pecl.php.net/package/amqp 如图: ![](https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2021%2F1112%2F7ef3d921j00r2gg3e008zc001eg00pyg.jpg&thumbnail=660x2147483647&quality=80&type=jpg) 这里有很多版本的,建议根据你自己的PHP版本去选择DLL下载,看到没,就是这个蓝色小图标的。 我自己下载的是 1.10.2 因为我的PHP版本是 7.3的 x64 nts 的。因此需要下载对应的版本: 7.3 Non Thread Safe (NTS) x64如图: ![](https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2021%2F1112%2Fcc20cbcbj00r2gg3f0065c001ds00ojg.jpg&thumbnail=660x2147483647&quality=80&type=jpg) 下载下来,解压得到文件如图: ![](https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2021%2F1112%2F9949661fj00r2gg3g000rc000o7007cg.jpg&thumbnail=660x2147483647&quality=80&type=jpg) 这里需要注意,您需要将php\_amqp.dll放入php目录下的 ext 扩展目录中。这里需要注意的是,amqp和其他扩展不同,此处还有个 rabbitmq.4.dll 文件,此文件需要放在php目录下,也就是这里:如图 ![](https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2021%2F1112%2Fa459ee83j00r2gg3g004sc001b400jgg.jpg&thumbnail=660x2147483647&quality=80&type=jpg) 然后在 php.ini 中添加: **extension=php\_amqp.dll** 至于加载哪里,你找个空白行加一行就行。没啥特别要求。 注意: 这里有个坑啊,rabbitmq.4.dll 为啥要放在 php目录下,这个是有原因的,如果你不放,当你执行命令的时候会报错。请看图: ![](https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2021%2F1112%2F872195c6j00r2gg3h0010c000it00cag.jpg&thumbnail=660x2147483647&quality=80&type=jpg) 所以我这里放在了php目录下。 当然,你也可以放在system32目录。这里放在php目录下可以,是因为我的环境变量解析到了这个php目录。 这点是需要注意的,你们在网上看的别的兄弟写的教程,可能大家没有指出这点。 做完以上动作,至此扩展安装完毕。就是这么简单。 PHP里头如何使用RabbitMQ? 别想太多,我贴代码。你们记住死的就行,其他的直接套。 在上面我贴出来的图里头,扩展包里头有个benchmark.php 文件,这个是一个测试用文件,基本上你可以把它当成例子来使用,我接下来会写一个简单的示例,并在示例里头做好注释讲解,以便你更好的理解。 //这里$config 变量 是我这边本地环境的MQ配置。你在使用的过程中,可以赵这个格式,调整成你自己的。 $config= \[ 'host'=>'192.168.10.201', 'port'=>'5672', 'vhost'=>'/', 'login'=>'admin', 'password'=>'admin', \]; //这里用try 包裹,处理异常,因为这个程序执行起来之后,是一个长时进程,所以做好错误处理很有必要。我这里写的略简单,不要照抄,最好根据各自实际情况进行处理 try{ //这里是连接MQ $conn=newAMQPConnection($config); $res=$conn->connect(); //这里是从连接里头得到一个信道,你别管这个玩意儿是啥,你就这么写就好,其他的先不管。以后你熟悉了再说。 $ch=newAMQPChannel($conn); //通过信道创建一个交换机,这里要注意,交换机名称问题不大,但是type和队列名称需要重点注意,不要搞错了,我这里写的是消费者,生成者大家有兴趣自行完成。 $exchange=newAMQPExchange($ch); //type是交换机类型,一般你按照我写的这个写,不用改 $exchange->setType(AMQP\_EX\_TYPE\_DIRECT); //这里是flag标记,你直接这么写就好, $exchange->setFlags(AMQP\_AUTODELETE); $exchange->setName('this\_is\_exchange');//这是交换机名称,这里你可以动态创建,也可以写死。建议写死。 $exchange->declareExchange();//声明交换机, $q=newAMQPQueue($ch);//创建队列 $q->setFlags(AMQP\_AUTODELETE);//这里是flag标记,你直接这么写就好, $q->declareQueue();//声明队列 $q->setName("1SonPurchaseOrderStatus");//设置队列名称 $q->bind($exchange->getName());//给队列绑定交换机。 //这个consume 就是消费消息啦, $q->consume( function($envelope,$queue) { var\_dump($envelope->getBody()); }, AMQP\_AUTOACK);$q->delete(); $exchange->delete(); $conn->disconnect(); }catch(Exception$exc) { echo$exc->getTraceAsString(); var_dump($exc->getTrace()); }finally{ $q->delete(); $exchange->delete(); $conn->disconnect(); } 以上就是一个简单的php下使用RabbitMQ的示例。MQ的使用本身很简单,难点在于结合实际业务。大家如果有什么问题不懂的,欢迎留言。我可以解答PHP java C# py 前端,游戏编程 等相关的问题,以及大家在平时学习工作中遇到的问题都可以说出来讨论。