PHP使用ActiveMQ实现消息队列的方法详解


Posted in PHP onMay 31, 2019

本文实例讲述了PHP使用ActiveMQ实现消息队列的方法。分享给大家供大家参考,具体如下:

前面我们已经学了如何部署ActiveMQ,
我们知道通过ActiveMQ的一个管理后台可以查看任务队列。

今天

PHP使用ActiveMQ实现消息队列的方法详解
用PHP来操作ActiveMQ,我们可以借助一个第三方扩展。
下载:

composer require fusesource/stomp-php:2.0.*

然后新建test.php:

<?php

require __DIR__.'/vendor/autoload.php'; //引入自动加载的文件

$connect = new \FuseSource\Stomp\Stomp('tcp://10.211.55.13/:61613');
$connect->connect();

$userId = 1001;
$result = $connect->send('email',$userId); //比如发邮件
var_dump($result);

PHP使用ActiveMQ实现消息队列的方法详解
发送消息成功,打印bool(true)

我们在ActiveMQ自带的管理后台查看,确实有一个名为”email”的队列。
PHP使用ActiveMQ实现消息队列的方法详解

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

$data = array('id'=>1001,'email'=>'110@qq.com','content'=>'test');
$result = $connect->send('email',json_encode($data));

我们在MQ后台可以查看消息详细
PHP使用ActiveMQ实现消息队列的方法详解

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

//消息持久化 persistent为true,字符串的'true'
$result = $connect->send('email',json_encode($data),array('persistent'=>'true'));

前面我们完成了『发送』

给mq服务器发送消息(email消息)。
那么在mq的队列中的任务,又是怎么处理的呢?

<?php

require __DIR__.'/vendor/autoload.php'; //引入自动加载的文件

$connect = new \FuseSource\Stomp\Stomp('tcp://10.211.55.13/:61613');
$connect->connect();

//订阅队列消息
$connect->subscribe('email');

if ($connect->hasFrameToRead()){
  $frame = $connect->readFrame();
  print_r($frame);
}

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

FuseSource\Stomp\Frame Object
(
  [command] => MESSAGE
  [headers] => Array
    (
      [expires] => 0
      [destination] => /queue/email
      [priority] => 4
      [message-id] => ID:localhost.localdomain-38488-1488196907415-3:2:-1:1:1
      [timestamp] => 1489477647931
    )

  [body] => {"id":1001,"email":"110@qq.com","content":"test"}
)

body就把我们发送的内容读取出来了。

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

do{
  if ($connect->hasFrameToRead()){
    $frame = $connect->readFrame();
    print_r($frame->body);
  }
} while (true);

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

if ($connect->hasFrameToRead()){
    $frame = $connect->readFrame();
    //print_r($frame->body);

    //做业务逻辑
    //具体发送邮件的业务
    //send email

    //最后通知mq,我们已经处理了该条消息
    $connect->ack($frame);
  }

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

do{
  //会等待,直到有可用消息,才执行后面代码
  if ($connect->hasFrameToRead()){
    $frame = $connect->readFrame();
    //print_r($frame->body);

    //做业务逻辑
    //具体发送邮件的业务
    //send email
    sleep(2); //模拟延时

    //最后通知mq,我们已经处理了该条消息
    $connect->ack($frame);
  }

  //控制循环
  $next = true;
  if (file_exists(__DIR__.'/stop')){
    //如果有名为stop的一个文件
    //就不循环了
    $next = false;
  }
} while ($next);

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
十天学会php(3)
Oct 09 PHP
在字符串中把网址改成超级链接
Oct 09 PHP
php smarty的预保留变量总结
Dec 04 PHP
Sorting Array Values in PHP(数组排序)
Sep 15 PHP
php多个字符串替换成同一个的解决方法
Jun 18 PHP
PHP多例模式介绍
Jun 24 PHP
使用PHP进行微信公众平台开发的示例
Aug 21 PHP
PHP内核学习教程之php opcode内核实现
Jan 27 PHP
PHP socket 模拟POST 请求实例代码
Jul 18 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
Jul 03 PHP
php中的buffer缓冲区用法分析
May 31 #PHP
PHP实现基于状态的责任链审批模式详解
May 31 #PHP
Laravel框架实现调用百度翻译API功能示例
May 30 #PHP
Laravel框架学习笔记之批量更新数据功能
May 30 #PHP
PHP实现的微信公众号扫码模拟登录功能示例
May 30 #PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
May 30 #PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
May 29 #PHP
You might like
BBS(php &amp; mysql)完整版(八)
2006/10/09 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
使用php计算排列组合的方法
2013/11/13 PHP
必须收藏的23个php实用代码片段
2016/02/02 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
获取IE浏览器Cookie信息的方法
2017/01/23 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
JavaScript JSON使用原理及注意事项
2020/07/30 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
JS实现百度搜索框
2021/02/25 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
python实现文件路径和url相互转换的方法
2015/07/06 Python
Python实现递归遍历文件夹并删除文件
2016/04/18 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
Python selenium根据class定位页面元素的方法
2019/02/26 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
python迭代器常见用法实例分析
2019/11/22 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
浅谈Python中的继承
2020/06/19 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
有兼职工作经历的简历自我评价
2014/03/07 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
具结保证书
2015/01/17 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书