1,项目一级目录新建一个server文件

#!/usr/bin/env php
<?php
try {
require __DIR__ . "/start.php";
} catch (\Exception $e) {} $queueNames = config('queue.qnames');
if (empty($queueNames)) exit('队列名称未配置'); $option = $argv[1];
$queueName = isset($argv[2]) ? $argv[2] : null;
if ($queueName && !in_array($queueName, $queueNames)) exit('队列名称不存在'); if ($queueName) {
unset($queueNames);
$queueNames[] = $queueName;
} echo "开始操作... \n";
switch ($option) {
case 'start':
startQueue($queueNames);
break; case 'stop':
stopQueue($queueNames);
break; case 'reload':
stopQueue($queueNames);
startQueue($queueNames);
break; case 'monitor':
demon();
break; default:
echo '操作类型: start|stop|reload|monitor' . "\n";
break;
} echo "结束操作... \n"; function startQueue(array $queueNames)
{
$correct = 'dispatch/Correct/index$';
$ret = isProcessExist($correct);
if($ret == 0){
$cmd = "nohup php start.php dispatch/Correct/index >> /tmp/correct.log &";
system($cmd,$result);
($result == 0) or die("$cmd 启动失败 \n");
echo "$correct 队列已启动 \n";
}else {
echo "$correct 进程已存在,无需重启 \n";
}
foreach ($queueNames as $_queueName) {
$proccessname = "dispatch/Consume/index/qname/$_queueName$";
if(isProcessExist($proccessname) == 1) {
echo $_queueName . "进程已经存在,无需重启 \n";
}else {
$command = "nohup php start.php dispatch/Consume/index/qname/" . $_queueName." >> /tmp/$_queueName.log &";
system($command,$result);
($result == 0) or die("$command 启动失败 \n");
echo $_queueName . "队列已启动 \n";
}
}
} function demon()
{
$queues = config('queue.qnames'); foreach($queues as $queue) {
if(!isProcessExist($queue)) {
try{
startQueue([$queue]);
}catch(\Exception $e){
echo "队列监控启动失败: ".$e->getMessage()."\n";
}
}
}
} function stopQueue(array $queueNames)
{
$redisconf = config('redis');
$redis = \library\Redis::getInstance($redisconf);
foreach ($queueNames as $key => $_queueName) {
$redis->hset('script:signal', $_queueName, false);
\library\Queue::getInstance()->addEvent('Stop', [])->push($_queueName);
$proccessname = "dispatch/Consume/index/qname/$_queueName$";
while(true) {
usleep(200000); // 0.2s
$result = isProcessExist($proccessname);
if(!$result) {
break;
}
unset($result);
}
echo $_queueName . "队列已停止 \n";
}
} function isProcessExist($processname)
{
$ps = 'ps axu|grep "'.$processname.'"|grep -v "grep"|wc -l';
$ret = shell_exec("$ps");
$ret = rtrim($ret, "\r\n");
return $ret;
}

2,项目一级目录新建一个start.php

3,修改application/extra/queue.php

 

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +---------------------------------------------------------------------- return [
// 'connector' => 'Sync'
'qnames'=>[
'Trade', //投资,变现,返本相关
'Activity', //活动相关
'Sms', //发短信相关
'Repay', //借款人还款
'Interest', //计息,派息相关
'DebtOnline', //债权上线相关
'Other' //其他
],
'driver' => env('QUEUE_DRIVER', 'redis'),
];

thinkphp 实现rabbitMq常驻进程消费队列的更多相关文章

  1. PHP多进程消费队列

    引言 最近开发一个小功能,用到了队列mcq,启动一个进程消费队列数据,后边发现一个进程处理不过来了,又加了一个进程,过了段时间又处理不过来了...... 这种方式每次都要修改crontab,如果进程挂 ...

  2. PHP开发者该知道的多进程消费队列

    引言 最近开发一个小功能,用到了队列mcq,启动一个进程消费队列数据,后边发现一个进程处理不过来了,又加了一个进程,过了段时间又处理不过来了… 这种方式每次都要修改crontab,如果进程挂掉了,不会 ...

  3. RabbitMQ使用 prefetch_count优化队列的消费,使用死信队列和延迟队列实现消息的定时重试,golang版本

    RabbitMQ 的优化 channel prefetch Count 死信队列 什么是死信队列 使用场景 代码实现 延迟队列 什么是延迟队列 使用场景 实现延迟队列的方式 Queue TTL Mes ...

  4. RabbitMQ AMQP (高级消息队列协议)

    目录 RabbitMQ AMQP (高级消息队列协议) Message Queue 简介 概念 基本组成 场景及作用 AMQP简介 模型架构 基础组件 AMQP-RabbitMQ 简介 模型 特性 参 ...

  5. RabbitMQ详解(三)------RabbitMQ的五种队列

    上一篇博客我们介绍了RabbitMQ消息通信中的一些基本概念,这篇博客我们介绍 RabbitMQ 的五种工作模式,这也是实际使用RabbitMQ需要重点关注的. 这里是RabbitMQ 官网中的相关介 ...

  6. php实现常驻进程 多进程监控

    php都是通过crontabd定时脚本处理队列的,面试被问到php如何常驻进程进行处理队列,想了半天这样不知道是否是一种方式 <?php function logs(){ file_put_co ...

  7. RabbitMQ(二):Java 操作队列

    1. 简单模式 模型: P:消息的生产者 队列:rabbitmq C:消息的消费者 获取 MQ 连接 public static Connection getConnection() throws I ...

  8. RabbitMQ学习之延时队列

    原帖参考:http://www.cnblogs.com/telwanggs/p/7124687.html?utm_source=itdadao&utm_medium=referral http ...

  9. AMQP协议与RabbitMQ、MQ消息队列的应用场景

    什么是AMQP? 在异步通讯中,消息不会立刻到达接收方,而是被存放到一个容器中,当满足一定的条件之后,消息会被容器发送给接收方,这个容器即消息队列,而完成这个功能需要双方和容器以及其中的各个组件遵守统 ...

随机推荐

  1. python 文件合并和编号

    # -*- coding:utf-8 -*- import os import re p1=r"([0-9][0-9][AB])\.\w{3}$" pattern1=re.comp ...

  2. AD采样的一个例子

    用122.88k时钟采样153.6k的信号

  3. DIV+CSS实战(五)

    一.说明 前面实现了关键词订阅模块,现在实现站点订阅模块,主要实现的是站点添加界面.站点添加界面里面实现一个提示框不在提示的功能(保存到cookie中),还有就是实现一个站点的选择框,包括输入文字自动 ...

  4. cmd运行命令

    winver检查Windows版本 dxdiag检查DirectX信息 mem.exe显示内存使用情况 Sndvol32音量控制程序 sfc.exe系统文件检查器 gpedit.msc 组策略 reg ...

  5. ArcGIS Desktop python Add-in Python 插件的文件结构

    如上图所示: 插件文件夹在根目录下有一个config.xml文件,这个文件保存有在向导添加的描述该插件的定制信息. 插件还有一个安装文件夹,这个文件夹的主要功能是存放Python脚本. 你可以在安装文 ...

  6. iOS平台设置系统状态栏(通知栏、顶部状态栏)样式背景颜色或透明

    5+App开发 状态栏 配置系统状态栏样式 iOS平台可支持对系统状态栏样式的配置,在应用manifest.json文件的plus->distribute->apple下添加UIStatu ...

  7. python正则表达式转义注意事项

    无论哪种语言,在使用正则表达式的时候都避免不了一个问题,就是在匹配元字符的时候,需要对元字符进行转义,让 正则表达式引擎将其当做普通字符来匹配.本文主要以python为例,说明一下转义中需要注意的问题 ...

  8. 通过hbase实现日志的转存(MR AnalyserLogDataRunner和AnalyserLogDataMapper)

    操作代码(提前启动集群(start-all.sh).zookeeper(zkServer.sh start).启动历史任务服务器(mr-jobhistory-daemon.sh start histo ...

  9. Easyui datagrid绑定数据,新增,修改,删除写法

    @{ ViewBag.Title = "xw_xsfl"; } <script type="text/javascript"> var editIn ...

  10. PaaS服务之路漫谈(三)

    此文已由作者尧飘海授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Monolithic架构在产品访问量很大的情况下,有可能常会导致整个产品迭代或升级过程不能按预期进行,或者上 ...