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程序员工具
May 26 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
win7+apache+php+mysql环境配置操作详解
Jun 10 PHP
php之Memcache学习笔记
Jun 17 PHP
PHP调用C#开发的dll类库方法
Jul 28 PHP
php中simplexml_load_file函数用法实例
Nov 12 PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
PHP实现的curl批量请求操作示例
Jun 06 PHP
php数值计算num类简单操作示例
May 15 PHP
PHP实现腾讯短网址生成api接口实例
Dec 08 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 Memcached应用实现代码
2010/02/08 PHP
PHP操作XML作为数据库的类
2010/12/19 PHP
20个PHP常用类库小结
2011/09/11 PHP
php中执行系统命令的方法
2015/03/21 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
JS鼠标滑过图片时切换图片实现思路
2013/09/12 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
javascript实现简易计算器
2017/02/01 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
用Python实现大文本文件切割的方法
2019/01/12 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
用CSS3的box-reflect设置文字倒影效果的方法讲解
2016/03/07 HTML / CSS
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
实习介绍信范文
2015/05/05 职场文书
2015年领导干部廉洁自律工作总结
2015/05/26 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
MySQL中in和exists区别详解
2021/06/03 MySQL
Python基础之变量的相关知识总结
2021/06/23 Python