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的ASP防火墙
Oct 09 PHP
php&amp;java(二)
Oct 09 PHP
PHP分页显示制作详细讲解
Dec 05 PHP
坏狼的PHP学习教程之第1天
Jun 15 PHP
php 301转向实现代码
Sep 18 PHP
深入密码加salt原理的分析
Jun 06 PHP
浅谈discuz密码加密的方式
May 22 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 PHP
详解PHP原生DOM对象操作XML的方法
Oct 17 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
Nov 07 PHP
YII框架页面缓存操作示例
Apr 29 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计算函数执行时间的方法
2015/03/20 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
jQuery 选择器理解
2010/03/16 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
JS实现日期时间动态显示的方法
2015/12/07 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
vue生成token并保存到本地存储中
2018/07/17 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
2019/10/12 Javascript
python 生成器协程运算实例
2017/09/04 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
.net面试题
2016/09/17 面试题
写求职信有哪些注意事项
2014/05/08 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
投资申请报告
2015/05/19 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书
Django实现翻页的示例代码
2021/05/24 Python
浅谈CSS不规则边框的生成方案
2021/05/25 HTML / CSS
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL