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 相关文章推荐
使用Apache的htaccess防止图片被盗链的解决方法
Apr 27 PHP
探讨:web上存漏洞及原理分析、防范方法
Jun 29 PHP
PHP mysql与mysqli事务使用说明 分享
Aug 17 PHP
php不写闭合标签的好处
Mar 04 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
Jun 12 PHP
php中mysql连接方式PDO使用详解
Feb 25 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
Apr 20 PHP
一张表搞清楚php is_null、empty、isset的区别
Jul 07 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
Jul 13 PHP
基于thinkPHP框架实现留言板的方法
Oct 17 PHP
老生常谈PHP位运算的用途
Mar 12 PHP
PHP运用foreach神奇的转换数组(实例讲解)
Feb 01 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 Undefined index报错的修复方法
2011/07/17 PHP
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
javascript设置金额样式转换保留两位小数示例代码
2013/12/04 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
网站基于flash实现的Banner图切换效果代码
2014/10/14 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
2019/11/01 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
2020/11/05 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
详解Python中的循环语句的用法
2015/04/09 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
python判断一个集合是否为另一个集合的子集方法
2018/05/04 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
C#软件工程师英语面试题
2015/06/07 面试题
自我评价格式
2014/01/06 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
学生手册评语
2014/05/05 职场文书
小学生倡议书范文
2014/05/13 职场文书
低碳环保演讲稿
2014/08/28 职场文书
2014年班主任工作总结
2014/11/08 职场文书
杜甫草堂导游词
2015/02/03 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS