您的位置:首页 > 编程语言 > PHP开发

PHP版 RabbitMQ小技巧(一)用代码获得服务器上的消息队列名

2017-05-12 14:41 627 查看
  最近在新浪开发一个用了MQ的URL监控项目,对PHP版的RabbitMQ有一些了解。想先吐个槽,就算是今年1月份的某些MQ的教程,很多都是不对的,和我在4月份看到的 官方的Tutorial 都有不小区别,看来RabbitMQ的官方最近发生了很大的革新呀。下面直接进入主题。

  老规矩,直接讲干货,我直接跳过Erlang平台和RabbitMQ的安装。

利用MQ的bat获得消息队列

PHP代码获得消息队列
Linux系统

Windows系统

额外补充

1. 利用MQ的.bat获得消息队列

  不要怀疑为什么我会讲MQ的.bat命令,这是曲线救国策略,最根本的原因是PHP的MQ不能通过某个函数直接获得服务器上面部署的消息队列,

如下图,我设置了几个测试队列,并放入了5条测试消息。



在RabbitMQ可使用的条件下,利用自带的bat文件即可完成命令行获得队列



2. PHP代码获得消息队列

  在这部分我会用到正则表达式,不熟悉的同学可以看看这篇简短的博客 《PHP正则表达式入门教程》 ,包客官您满意。

Linux系统

define("RABBIT_SERVER_PATH", '/usr/local/lib/erlang/lib/rabbitmq_server-0.0.0');
$cmd = RABBIT_SERVER_PATH . '/sbin/rabbitmqctl list_queues';
exec($cmd, $res);
for ($i = 1; $i < count($res); $i++){
preg_match("/[\w\W]+(?=\s)/", $res[$i], $matches);
$queueNames[] = trim($matches[0]);
unset($matches);
}
var_dump($queueNames);


RABBIT_SERVER_PATH,是MQ的安装位置,

exec($cmd, $res),执行list_queues命令,MQ的server会返回队列到$res中,并会形成数组,形如下图:



“/[\w\W]+(?=\s)/”,分为2部分看,[\w\W]+为了捕捉所有的中文、英文、数字、字符,(?=\s)为正向预查空字符。比如当返回“testQueue2   2”时,会捕捉到字符串“testQueue2”。

trim($match[0]),有时捕捉的字符串太短,所以会捕捉到空字符,去除即可。

最后输出如下图:



Windows系统

//注意Windows路径分隔是反斜杠“\”。
define("RABBIT_SERVER_PATH", 'cd E:\RabbitMQ Server\rabbitmq_server-3.6.6');
$cmd = RABBIT_SERVER_PATH . ' & .\sbin\rabbitmqctl list_queues';
exec($cmd, $res);
for ($i = 1; $i < count($res); $i++){
preg_match("/[\w\W]+(?=\s)/", $res[$i], $matches);
$queueNames[] = trim($matches[0]);
unset($matches);
}
var_dump($queueNames);


代码与上面类似,不再赘述,最终输出如下图:



3. 额外补充

个人感想:

  我承认这种办法很诡异,但是确实是没有办法的办法了,很多时候必须要获得目前服务器上的队列名才能写某些业务,比如,写消费者的时候、想自动化检测是否初始化MQ部署的时候等等。

  如果有更好的获取MQ服务器的方法,请联系本人1,必将更好方法更新于此篇博文,将知识分享给大众。

  下一篇文章将会讲解一些最新的MQ的使用方法,敬请期待。

后期优化方案:

  代码速度还不够快,Linux要1s左右,Windows居然要4s,时间肯定是不能适应企业应用情景。如果要频繁获取队列,个人推荐利用Memcached扩展,把队列加入内存中,理论上读取时间在ms级别。

邮箱地址:546026679@qq.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php rabbitmq-实战