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 无限级 SelectTree 类
May 19 PHP
PHP高级对象构建 多个构造函数的使用
Feb 05 PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 PHP
提升PHP性能的21种方法介绍
Jun 25 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 PHP
php防止恶意刷新与刷票的方法
Nov 21 PHP
PHP网站开发中常用的8个小技巧
Feb 13 PHP
php实现cookie加密的方法
Mar 10 PHP
CodeIgniter表单验证方法实例详解
Mar 03 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
php 读写json文件及修改json的方法
Mar 07 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
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
PHPMailer安装方法及简单实例
2008/11/25 PHP
PHP 网页过期时间的控制代码
2009/06/29 PHP
PHP文件读写操作之文件写入代码
2011/01/13 PHP
php实现文件下载功能的几个代码分享
2014/05/10 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
2013/01/23 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
微信小程序解析富文本过程详解
2019/07/13 Javascript
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
python中迭代器(iterator)用法实例分析
2015/04/29 Python
python开发之for循环操作实例详解
2015/11/12 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
python程序需要编译吗
2020/06/19 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
如何用用Python将地址标记在地图上
2021/02/07 Python
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
应届毕业生个人求职自荐信
2014/01/06 职场文书
《灯光》教学反思
2014/02/08 职场文书
慈善晚会策划方案
2014/05/14 职场文书
2014财务年度工作总结
2014/11/11 职场文书
mysql 带多个条件的查询方式
2021/06/05 MySQL