介绍
这期内容当中小编将会给大家带来有关怎么在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()美元;
上面我们发送的一个id,我们还可以发送json数据。
data 美元;=,数组(& # 39;id # 39;=祝辞;1001年,& # 39;电子邮件# 39;=祝辞& # 39;110 @qq.com& # 39;, & # 39;内容# 39;=祝辞& # 39;测试# 39;); result 美元;=,连接→美元发送(& # 39;电子邮件# 39;,json_encode(数据)美元);
我们在MQ后台可以查看消息详细
上面的代码到这里,还不够完美。如果我们服务器重启了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实现一个消息队列