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. IntellJ IDEA javax.servlet.ServletException 找不到javax.servlet.ServletException的类 java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

    误状态:错误显示 解决: (1)说明缺少包---->添加如下包配置 <dependency> <groupId>javax.servlet.jsp</groupId ...

  2. IDEA如何初始化Git本地仓库,并提交到远程仓库

    本文转载自:http://blog.csdn.net/two_people/article/details/77008593 1. 首先在远程仓库上新建一个项目,码云和github都可以,我这里使用的 ...

  3. tred_extract_EDED_new

    # -*- coding:utf-8 -*- import re ''' 适应新版本 ''' year='17a'#用户自定义 ss='./data/'#根目录 filename = ss+'EDED ...

  4. windows下命令提示符中有空格路径的解决方法

    1)用缩写.比如c:\Program Files 缩写为c:\Progra~1 再来刨根问底查查这个命名是否有规则,于是找到: 文件夹(sub-directry)名称,以前是不允许带空白的,后来允许带 ...

  5. 笔记:CSS常用中文字体英文名称对照表

    * 分类排序:中文名+英文名+Unicode+Unicode 2 Windows平台新细明体 PMingLiU \65B0\7EC6\660E\4F53 新细明体细明体 MingLiU \7EC6\6 ...

  6. (网络流 最大流 Dinic || SAP)Control -- hdu --4289

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4289 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  7. hdu 5015 233矩阵快速幂

    http://acm.hdu.edu.cn/showproblem.php?pid=5015 需要构造一个 n+2 维的矩阵. 就是要增加一维去维护2333这样的序列. 可以发现 2333 = 233 ...

  8. 通过keepalived搭建MySQL双主模式的高可用集群系统

    1. 配置MySQL双主模式 1.修改my.cnf配置文件 默认情况下,MySQL的配置文件是/etc/my.cnf,在配置文件的[mysqld]段添加如下内容: server-id=1 log-bi ...

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

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

  10. koa和egg项目webpack热更新实现

    背景 在用Node.js+Webpack构建的方式进行开发时, 我们希望能实现修改代码能实时刷新页面UI的效果. 这个特性webpack本身是支持的, 而且基于koa也有现成的koa-webpack- ...