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. Netty学习第二节Java IO通信

    一.Java IO通信 名词解释: BIO通信:       采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端连接,在接收到客户端请求后,为每一个客户端建立一个新的线程负 ...

  2. Vivado 常见报错

    1.[Synth 8-2543] port connections cannot be mixed ordered and named 说明例化时最后一个信号添加了一个逗号. 2. 原因:报告说明有一 ...

  3. 如何手动编译java文件

    1,在编辑框中,将目录切至java文件所在的地址 如图 2,开始编译java文件 用命令javac 编译目标java文件,文件需带后缀名 ; 用java 执行class, 此时class文件无需带后缀 ...

  4. js常用的原生方法

    JavaScript pow() 方法 pow() 方法可返回 x 的 y 次幂的值 语法 Math.pow(x,y) 参数 描述 x 必需.底数.必须是数字. y 必需.幂数.必须是数字. 返回值 ...

  5. mongodb 命令行安装

    因为下载zip的文件速度快,所以就使用了zip,zip格式的解压完后需要使用命令行安装,步骤大致如下: 1,首先创建一个文件叫mongo的文件,里面包含了数据库存放的目录以及日志,然后在指定的目录下创 ...

  6. .NET Core 和 .NET .Framework 速度比较

    废话不多说! 一下是 .NET core 和 .NET framework 速度对比. 两者使用最慢的冒泡排序算法:  排序10万条数据 次数 .NET CORE(耗时) .NET framework ...

  7. NetCore入门篇:(六)Net Core项目使用Controller之一

    一.简介 1.当前最流行的开发模式是前后端分离,Controller作为后端的核心输出,是开发人员使用最多的技术点. 2.个人所在的团队已经选择完全抛弃传统mvc模式,使用html + webapi模 ...

  8. 逆变(contravariant)与协变(covariant)

    逆变(contravariant)与协变(covariant)是C#4新增的概念,许多书籍和博客都有讲解,我觉得都没有把它们讲清楚,搞明白了它们,可以更准确地去定义泛型委托和接口,这里我尝试画图详细解 ...

  9. c# 协变与抗变

    定义 协变:与原始类型转换方向相同的可变性称为协变. 抗变:与派生类型转换方向相同的可变性称为抗变. 补充: 参数是协变的,可以使用派生类对象传入需要基类参数的方法,反之不行 返回值是抗变的,不能使用 ...

  10. [TJOI2013]攻击装置(网络流,最小割)

    前言 网络流被hbx吊起来打 Solution 考虑一下这个走法是不是和象棋中马的走法一模一样(废话) 那么显然我每一次移动是走三次,如果将棋盘二分图染色一下,不就是每一次只能走到另一个颜色的吗? 然 ...