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. 优秀前端工程师必备:" checkbox & radio--单钩 & 多钩 "大比较:你是♂||♀ , 还是 ♂&♀

    1 单选: type="radio"  需求: 男女input只能选择一个 <input type="radio" name="sex" ...

  2. HDU 2393 Higher Math (判断直角三角形)

    题意:给定三个边,判断是不是直角三角形. 析:水题,勾股定理... 代码如下: #include <iostream> #include <cstdio> #include & ...

  3. 测试-LoadRunner

    1录脚本 设置解析方式,html形式,会精炼成一个函数,此时找有用的url,写出函数:url方式,函数比较多. 参数化 两参数成对时,在脚本处选成对. 加上进程,加上返回值判断. 最后一段接口url, ...

  4. struts2从浅至深(三)拦截器

    一:拦截器概述 Struts2中的很多功能都是由拦截器完成的. 是AOP编程思想的一种应用形式. 二:拦截器执行时机                             interceptor表示 ...

  5. hdu 5032 不易发觉的树状数组

    http://acm.hdu.edu.cn/showproblem.php?pid=5032 给定一个1000x1000的点阵,m组询问,每次询问一个由(0,0).(x,0)点一以及从原点出发的方向向 ...

  6. static关键字(二)作用总结

    静态变量和静态方法 static关键字最基本的用法是: 1.被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来 2.被static修饰的方法属于类方法,可以通过 ...

  7. EBS xml publisher中文乱码

    http://www.cnblogs.com/benio/archive/2011/11/22/2259313.html   由于本机环境问题,导致做的xml publisher报表跑不出来. 无法显 ...

  8. Android DalivkVM与JVM的比较

    JVM 与 DalivkVM的区别 Android 为什么还有搞一个Dalivk虚拟机,不是已经就有Java虚拟机了吗,为什么还要专门搞一个Dalivk虚拟机呢? 答: 1.以前Java是Sun公司的 ...

  9. maven仓库地址配置

    # 背景 maven中央存库在国外,访问缓慢,一般国内镜像,这里推荐阿里云的 http://maven.aliyun.com/nexus/content/groups/public 我之前采用的方式是 ...

  10. JAVA 从头开始<三>

    一.数据类型转换 取反:1变0,0变1 强转 Insteger.toBinaryString(-7); 下面这样写会出错,要用l来接收 为什么byte b 可以接收int类型(而不是10b),大数据类 ...