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新手上路(八)
Oct 09 PHP
php中实现记住密码自动登录的代码
Mar 02 PHP
PHP+Mysql+jQuery实现动态展示信息
Oct 08 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
php实现文件编码批量转换
Mar 10 PHP
微信公众平台天气预报功能开发
Jul 06 PHP
php实现session自定义会话处理器的方法
Jan 27 PHP
codeigniter中实现一次性加载多个view的方法
Mar 20 PHP
Smarty模板简单配置与使用方法示例
May 23 PHP
PHP页面输出时js设置input框的选中值
Sep 30 PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 PHP
PHP基于phpqrcode类生成二维码的方法详解
Mar 14 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
php创建多级目录代码
2008/06/05 PHP
初识ThinkPHP控制器
2016/04/07 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
jQuery Clone Bug解决代码
2010/12/22 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
2013/11/18 Javascript
javascript 通用loading动画效果实例代码
2014/01/14 Javascript
jquery+ajax请求且带返回值的代码
2015/08/12 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
Jquery中attr与prop的区别详解
2017/05/27 jQuery
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
JavaScript实现移动端弹窗后禁止滚动
2020/05/25 Javascript
如何在vue中使用HTML 5 拖放API
2021/01/14 Vue.js
python实现爬取千万淘宝商品的方法
2015/06/30 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
python中csv文件的若干读写方法小结
2018/07/04 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
django admin 添加自定义链接方式
2020/03/11 Python
css3.0新属性效果在ie下的解决方案
2010/05/10 HTML / CSS
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
使用HTML5做个画图板的方法介绍
2013/05/03 HTML / CSS
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
机电专业个人求职信范文
2013/12/30 职场文书
80后职场人的职业生涯规划
2014/03/08 职场文书
航空学院求职信
2014/06/11 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
县委常委班子专题民主生活会查摆问题及整改措施
2014/09/27 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
大学生受助感言
2015/08/01 职场文书