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中实现汉字转区位码应用源码实例解析
Jun 14 PHP
PHP+ACCESS 文章管理程序代码
Jun 21 PHP
php简单的会话类代码
Aug 08 PHP
利用PHP生成静态HTML文档的原理
Oct 29 PHP
php单例模式实现(对象只被创建一次)
Dec 05 PHP
php实现给一张图片加上水印效果
Jan 02 PHP
Linux系统中为php添加pcntl扩展
Aug 28 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
Sep 18 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
使用PHP开发留言板功能
Nov 19 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 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
避免Smarty与CSS语法冲突的方法
2015/03/02 PHP
CI框架的安全性分析
2016/05/18 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
input 高级限制级用法
2009/03/26 Javascript
JavaScript 创建对象
2009/07/17 Javascript
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
JS中的多态实例详解
2017/10/15 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
微信小程序实现签到弹窗动画
2020/09/21 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
python求前n个阶乘的和实例
2020/04/02 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
预备党员承诺书
2014/03/25 职场文书
小小商店教学反思
2014/04/27 职场文书
疾病防治方案
2014/05/31 职场文书
大学生安全责任书
2014/07/25 职场文书
尼克胡哲观后感
2015/06/08 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA
Tomcat配置访问日志和线程数
2022/05/06 Servers