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 strstr查找字符串中是否包含某些字符的查找函数
Jun 03 PHP
php设计模式 Adapter(适配器模式)
Jun 26 PHP
php下载文件的代码示例
Jun 29 PHP
php用header函数实现301跳转代码实例
Nov 25 PHP
网页上facebook分享功能具体实现
Jan 26 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
Jun 13 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
Nov 08 PHP
php判断访问IP的方法
Jun 19 PHP
深入浅析PHP7.0新特征(五大新特征)
Oct 29 PHP
php cookie工作原理与实例详解
Jul 18 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
Dec 07 PHP
PHP中的正则表达式实例详解
Apr 25 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中的Cannot modify header information 问题
2013/08/12 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
jQuery调用WebService的实现代码
2011/06/19 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
Jquery 分页插件之Jquery Pagination
2015/08/25 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
浅谈React 服务器端渲染的使用
2018/05/08 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
vuex实现的简单购物车功能示例
2019/02/13 Javascript
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
Linux面试题LINUX系统类
2015/11/25 面试题
自主招生自荐信格式
2013/12/03 职场文书
家长对小学生的评语
2014/01/28 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
同学毕业留言寄语
2015/02/27 职场文书
2016年入党心得体会范文
2016/01/23 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript
关于使用Redisson订阅数问题
2022/01/18 Redis
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL
Win2008系统搭建DHCP服务器
2022/06/25 Servers