怎么在PHP中使用ActiveMQ实现一个消息队列

  介绍

这期内容当中小编将会给大家带来有关怎么在PHP中使用ActiveMQ实现一个消息队列,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

下载:

composer  require  fusesource/stomp-php: 2.0 . *

然后新建测试。php:

& lt; php ?      require  __DIR__强生# 39;/供应商/autoload.php& # 39;;,//引入自动加载的文件      $ connect =, new  \ FuseSource \跺脚\跺脚(& # 39;tcp://10.211.55.13/: 61613 & # 39;);   连接→美元connect ();      时间=美元userId  1001;   美元$ result =,连接→发送(& # 39;电子邮件# 39;,美元userId);,//比如发邮件   var_dump()美元;

怎么在PHP中使用ActiveMQ实现一个消息队列“> <br/>发送消息成功,打印<代码> bool(真正的)</代码> </p> <p>我们在ActiveMQ自带的管理后台查看,确实有一个名为“电子邮件”的队列。<br/> <img src=

上面我们发送的一个id,我们还可以发送json数据。

data 美元;=,数组(& # 39;id # 39;=祝辞;1001年,& # 39;电子邮件# 39;=祝辞& # 39;110 @qq.com& # 39;, & # 39;内容# 39;=祝辞& # 39;测试# 39;);   result 美元;=,连接→美元发送(& # 39;电子邮件# 39;,json_encode(数据)美元);

我们在MQ后台可以查看消息详细
怎么在PHP中使用ActiveMQ实现一个消息队列

上面的代码到这里,还不够完美。如果我们服务器重启了ActiveMQ,没有处理的消息会丢失。
这个时候我们需要用到<代码>发送()方法的第三个参数。

//消息持久化,持续为真的,字符串的& # 39;真正的# 39;   美元$ result =,连接→发送(& # 39;电子邮件# 39;,json_encode(元数据),数组(& # 39;持久# 39;=祝辞& # 39;真正的# 39;));
& lt; php ?      require  __DIR__强生# 39;/供应商/autoload.php& # 39;;,//引入自动加载的文件      $ connect =, new  \ FuseSource \跺脚\跺脚(& # 39;tcp://10.211.55.13/: 61613 & # 39;);   连接→美元connect ();//订阅队列消息   连接→美元订阅(& # 39;电子邮件# 39;);      if (连接→美元hasFrameToRead ()) {   时间=美元才能frame 连接→美元readFrame ();   print_r才能(框架);   }

在mq服务端,订阅(监听)队列消息。
在服务端是命令行下执行:php mqServer <代码>。php代码
如果有没有处理的消息,可以读取出来,打印结果如下:

FuseSource \跺脚\ Frame 对象   (   (命令),才能=祝辞消息   [标题],才能=祝辞数组   ,,,(   ,,,,,(到期),=在0   ,,,,,(目的地),=祝辞/队列/电子邮件   ,,,,,(优先),=祝辞;4   ,,,,,(问题),=祝辞,ID: localhost.localdomain - 38488 - 1488196907415 - 3:2:比   ,,,,,(时间戳),=祝辞,1489477647931   ,,,)      (身体),才能=祝辞,{“id": 1001年,“email":“110 @qq.com",“content":“test"}   )

<代码> 身体就把我们发送的内容读取出来了。

我们循环读取(死循环)一直等待新消息:

做{   if 才能;(连接→美元hasFrameToRead ()) {   ,,,frame 美元;=,连接→美元readFrame ();   ,,,print_r(身体框架→美元);   ,,}   },while (真);

处理消息之后(在发送邮件等业务完成之后),要通知mq我处理了该条消息了

,, if (连接→美元hasFrameToRead ()) {   ,,,frame 美元;=,连接→美元readFrame ();   ,,,//print_r(身体框架→美元);      ,,,//做业务逻辑   ,,,//具体发送邮件的业务   ,,,//send 电子邮件      ,,,//最后通知mq,我们已经处理了该条消息   ,,,连接→美元ack(框架);   以前,,}

我们还可以在优化一下代码,解决死循环,控制循环(这里是一种方案演示)

做{//才能会等待,直到有可用消息,才执行后面代码   if 才能;(连接→美元hasFrameToRead ()) {   ,,,frame 美元;=,连接→美元readFrame ();   ,,,//print_r(身体框架→美元);      ,,,//做业务逻辑   ,,,//具体发送邮件的业务   ,,,//send 电子邮件   ,,,(2)睡觉,,//模拟延时      ,,,//最后通知mq,我们已经处理了该条消息   ,,,连接→美元ack(框架);   ,,}//才能控制循环   next 美元;=,才能正确;   if 才能;(file_exists (__DIR__强生# 39;/停止# 39;)){   ,,,//如果有名为停止的一个文件   ,,,//就不循环了   ,,,next 美元;=,假;   ,,}   },while (美元);

怎么在PHP中使用ActiveMQ实现一个消息队列