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 相关文章推荐
Classes and Objects in PHP5-面向对象编程 [1]
Oct 09 PHP
dede3.1分页文字采集过滤规则详说(图文教程)续二
Apr 03 PHP
PHP与SQL注入攻击[二]
Apr 17 PHP
强制PHP命令行脚本单进程运行的方法
Apr 15 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
Jun 19 PHP
php使用date和strtotime函数输出指定日期的方法
Nov 14 PHP
php简单实现屏蔽指定ip段用户的访问
Apr 29 PHP
PHP中文字符串截断无乱码解决方法
Oct 10 PHP
Ubuntu 16.04下安装PHP 7过程详解
Mar 28 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 PHP
php和redis实现秒杀活动的流程
Jul 17 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
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
用PHP为SHOPEX增加日志功能代码
2010/07/02 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
2018/08/19 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
javascript 实用的文字链提示框效果
2010/06/30 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
javascript常用的方法分享
2015/07/01 Javascript
jQuery的bind()方法使用详解
2015/07/15 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
2017/01/18 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
Vue配置marked链接添加target=&quot;_blank&quot;的方法
2019/07/19 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
JavaScript动态生成表格的示例
2020/11/02 Javascript
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
[50:24]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python获取本机所有IP地址的方法
2018/12/26 Python
python lxml中etree的简单应用
2019/05/10 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
2013年入党人员的自我鉴定
2013/10/25 职场文书
行政管理人员精品工作推荐信
2013/11/04 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
工厂车间标语
2014/06/19 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python
浅谈Python数学建模之数据导入
2021/06/23 Python
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js