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函数代码
Apr 22 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
Sep 16 PHP
PHP之uniqid()函数用法
Nov 03 PHP
浅析php工厂模式
Nov 25 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
php array_merge函数使用需要注意的一个问题
Mar 30 PHP
WordPress中使主题支持小工具以及添加插件启用函数
Dec 22 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
Zend Framework入门教程之Zend_Mail用法示例
Dec 08 PHP
Laravel多用户认证系统示例详解
Mar 13 PHP
php 中htmlentities导致中文无法查询问题
Sep 10 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下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
用穿越火线快速入门php面向对象
2012/02/22 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
jquery控制select的text/value值为选中状态
2014/06/03 Javascript
Nodejs实现批量下载妹纸图
2015/05/28 NodeJs
jQuery操作属性和样式详解
2016/04/13 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
canvas绘制万花筒效果(代码分享)
2017/01/20 Javascript
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
2018/10/26 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
python获取各操作系统硬件信息的方法
2015/06/03 Python
Python中MySQL数据迁移到MongoDB脚本的方法
2016/04/28 Python
带你了解python装饰器
2017/06/15 Python
python中map的基本用法示例
2018/09/10 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
更新修改后的Python模块方法
2019/03/03 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
Python中turtle库的使用实例
2019/09/09 Python
python+pygame实现坦克大战
2019/09/10 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
python构造IP报文实例
2020/05/05 Python
浅析Python requests 模块
2020/10/09 Python
传媒专业推荐信范文
2013/11/23 职场文书
财务方面个人工作的自我评价
2013/12/28 职场文书
上班早退检讨书
2014/01/09 职场文书
《诺贝尔》教学反思
2014/02/17 职场文书
上海世博会口号
2014/06/19 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
穆斯林的葬礼读书笔记
2015/06/26 职场文书
捐款仪式主持词
2015/07/04 职场文书