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(2)――PHP类型
Feb 15 PHP
PHP 可阅读随机字符串代码
May 26 PHP
PHP执行zip与rar解压缩方法实现代码
Dec 05 PHP
php批量缩放图片的代码[ini参数控制]
Feb 11 PHP
PHP中的事务使用实例
May 26 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
Mar 21 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
Nov 10 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
利用PHP获取网站访客的所在地位置
Jan 18 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
Apr 20 PHP
laravel获取不到session的三种解决办法【推荐】
Sep 16 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
上海牌131型七灯四波段四喇叭一级收音机
2021/03/02 无线电
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
php发送邮件的问题详解
2015/06/22 PHP
PHP请求远程地址设置超时时间的解决方法
2016/10/29 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
2017/06/09 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
jquery向上向下取整适合分页查询
2014/09/06 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
python数据结构之列表和元组的详解
2017/09/23 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
python 实现按对象传值
2019/12/26 Python
Python @property原理解析和用法实例
2020/02/11 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
Java的类与C++的类有什么不同
2014/01/18 面试题
运动会邀请函范文
2014/01/31 职场文书
服装设计专业自荐信
2014/06/17 职场文书
2014教师党员自我评议总结
2014/09/19 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
道路交通事故人身损害赔偿协议书
2014/11/19 职场文书
使用python向MongoDB插入时间字段的操作
2021/05/18 Python
详解Vue的列表渲染
2021/11/20 Vue.js