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
Oct 09 PHP
php缓存技术介绍
Nov 25 PHP
PHP 错误之引号中使用变量
May 04 PHP
如何取得中文字符串中出现次数最多的子串
Aug 08 PHP
php中\r \r\n \t的区别示例介绍
Feb 08 PHP
PHP采用XML-RPC构造Web Service实例教程
Jul 16 PHP
php中数据库连接方式pdo和mysqli对比分析
Feb 25 PHP
php文件类型MIME对照表(比较全)
Oct 07 PHP
PHP查询大量数据内存耗尽问题的解决方法
Oct 28 PHP
静态html文件执行php语句的方法(推荐)
Nov 21 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 PHP
XAMPP升级PHP版本实现步骤解析
Sep 04 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代码简化
2010/02/08 PHP
学习使用curl采集curl使用方法
2012/01/11 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
Laravel路由设定和子路由设定实例分析
2016/03/30 PHP
YII框架关联查询操作示例
2019/04/29 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
Jquery EasyUI $.Parser
2017/06/02 jQuery
echart简介_动力节点Java学院整理
2017/08/11 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
JavaScript中的一些隐式转换和总结(推荐)
2017/12/22 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
2018/09/25 Javascript
JS html事件冒泡和事件捕获操作示例
2019/05/01 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
vue项目中js-cookie的使用存储token操作
2020/11/13 Javascript
跟老齐学Python之深入变量和引用对象
2014/09/24 Python
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
python3使用GUI统计代码量
2019/09/18 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
厂长助理岗位职责
2013/12/27 职场文书
老师给学生的表扬信
2014/01/17 职场文书
就业协议书样本
2014/08/20 职场文书
婚宴父亲致辞
2015/07/27 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书
导游词之新疆-喀纳斯
2019/10/10 职场文书
七个Python必备的GUI库
2021/04/27 Python
vue项目支付功能代码详解
2022/02/18 Vue.js
详解Python中__new__方法的作用
2022/03/31 Python