一,创建守候进程,因为这里不需要Server,也没有Client,数据交换通过redis进行

<?php
namespace Kuba\Saas;
require_once __DIR__ . '/Core/ErrorHandle.php';
use \Swoole\Timer;
use \Swoole\Process;
use Kuba\Saas\Core\ErrorHandle; final class Services { private $m_workers = [];
private $m_pid = 0; public function __construct() {
try {
$this->m_pid = posix_getpid(); echo "moolan_services start:".$this->m_pid.PHP_EOL;
echo date("Y-m-d H:i:s").PHP_EOL; \swoole_set_process_name("moolan_services"); $this->create_error_monitor_process($this->m_pid); //监控子进程的状态,如果子进程异常退出,则重启该子进程
$this->process_monitor();
}catch (\Exception $e){
die('ALL ERROR: '.$e->getMessage());
}
} private function process_monitor()
{
//检测子进程是否结束,如果结束,则重新启动子进程
while(1) {
if(count($this->m_workers)){
//这里会一直等待,一次接收一个子进程,所以外面必须有循环
$ret = \swoole_process::wait();
if ($ret) {
$this->process_reboot($ret);
}
}
}
} private function process_reboot($ret){
try
{
$pid=$ret['pid']; if(in_array($pid, $this->m_workers)){
$method_name = $this->m_workers[$pid];
unset($this->m_workers[$pid]); echo $method_name." restart:".$pid.PHP_EOL;
echo date("Y-m-d H:i:s").PHP_EOL; $method = new \ReflectionMethod($this, $method_name);
$method->invoke($this, [$this->m_pid]); return;
}
}
catch (\Exception $e)
{
die('Process_reboot error: '.$e->getMessage());
}
} /**
* 创建监控系统错误的进程
*
* 该进程属于一条一条处理的模式,因为错误不会太多
*/
private function create_error_monitor_process($mpid)
{
try
{
$process = new Process(function ($worker) use ($mpid)
{
try
{
\swoole_set_process_name("moolan_error_handle"); $obj_error_handle = new ErrorHandle();
while (true)
{
try
{
//从消息队列接收出错消息,接收到一个,就启动一个task去执行
//如果接收不到出错信息,则休息2秒时间
if (!$obj_error_handle->fetch_task())
{
$obj_error_handle->release_task();
unset($obj_error_handle); usleep(2000000); $obj_error_handle = new ErrorHandle();
}
else
{
//启动任务处理接收到的出错信息
$obj_error_handle->do_task();
} //执行完一个完成的任务后,
//查看主进程是否已经关闭,如果已经关闭,则子进程也要关闭运行
if(!\swoole_process::kill($mpid,0)){
echo 'moolan service gone'.PHP_EOL;
echo __METHOD__.' process exit'.PHP_EOL;
$worker->exit();
}
}
catch (\Exception $e)
{
echo $e->getMessage();
}
}
}
catch (\Exception $e)
{
die(__METHOD__.' process exec error: '.$e->getMessage());
}
}, false); $pid = $process->start(); echo __METHOD__." started:".$pid.PHP_EOL;
echo date("Y-m-d H:i:s").PHP_EOL; $this->m_workers[$pid] = __METHOD__;
}
catch (\Exception $e)
{
die(__METHOD__.' Process Start error: '.$e->getMessage());
}
} } $server = new Services();

  二,创建值守脚本,检测以上主进程持续运行

#! /bin/sh

proc_name="***"                    # 进程名
proc_file="***.php"
log_name="/***/moolan-monitor.log" # 日志文件
pid=0 proc_num() # 计算进程数
{
num=`ps -ef | grep $proc_name | grep -v grep | wc -l`
return $num
} proc_id() # 进程号
{
pid=`ps -ef | grep $proc_name | grep -v grep | awk '{print $2}'`
} proc_num
number=$?
if [ $number -eq 0 ] # 判断进程是否存在
then
nohup /usr/local/php5/bin/php /***/$proc_file >>$log_name 2>&1 & # 重启进程的命令,请相应修改
proc_id # 获取新进程号
echo ${pid}, `date` >> $log_name # 将新进程号和重启时间记录
fi

  三,把值守脚本加入到定时器

crontab

利用定时任务来轮询执行脚本

*/1 * * * * /PATH/watch_queue.sh

swoole创建工作进程,执行滞后工作的更多相关文章

  1. 【转】Nginx系列(三)--管理进程、多工作进程设计

    原博文出于:http://blog.csdn.net/liutengteng130/article/details/46700999  感谢! Nginx由一个master进程和多个worker进程组 ...

  2. IIS6与IIS7中的w3wp工作进程

    在IIS6中,每一个网站都有对应的应用程序池,在应用程序池有运行着网站的Application,在默认情况下,所有的网站的应用程序都会分配到默认的应用程序池当中,   当然,我们可以新建一个应用程序池 ...

  3. 从整体上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换

    学号后三位<168> 原创作品转载请注明出处https://github.com/mengning/linuxkernel/ 1.分析fork函数对应的内核处理过程sys_clone,理解 ...

  4. Nginx系列(三)--管理进程、多工作进程设计

    Nginx由一个master进程和多个worker进程组成,但master进程或者worker进程中并不会再创建线程. 一.master进程和worker进程的作用 master进程 不须要处理网络事 ...

  5. Nginx之监控进程和工作进程

    1. 函数调用分析 在开启 master 的情况下,多进程模型的下的入口函数为 ngx_master_process_cycle,如下: int mian() { ... if (ngx_proces ...

  6. Linux内核设计与实现 总结笔记(第八章)下半部和推后执行的工作

    上半部分的中断处理有一些局限,包括: 中断处理程序以异步方式执行,并且它有可能打断其他重要代码的执行. 中断会屏蔽其他程序,所以中断处理程序执行的越快越好. 由于中断处理程序往往需要对硬件进行操作,所 ...

  7. iis最大工作进程数

    IIS 6.0允许将应用程序池配置成一个Web园(Web Garden).要理解Web园的概念,可以设想这样一种情形:假设有一个IIS 5.0服务器和三个Web网站,每一个Web网站运行着相同的应用程 ...

  8. 你真的了解:IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数 吗?

    原文链接:http://www.cnblogs.com/yinhaichao/p/4060209.html?utm_source=tuicool&utm_medium=referral 一般购 ...

  9. 【Python】 配置文件相对路径&软件自动执行的工作目录

    今天对监控脚本做了一些变更,然后突然发现监控全部都失效了..排查了半天问题仍然不知所踪.最终发现居然是一个踩过好几次的老坑.. 就是脚本内写的配置文件为了调试方便写成了相对路径,但是在上线时没有意识到 ...

随机推荐

  1. 2.26 js解决click失效问题

    2.26 js解决click失效问题 前言有时候元素明明已经找到了,运行也没报错,点击后页面没任何反应.这种问题遇到了,是比较头疼的,因为没任何报错,只是click事件失效了.本篇用2种方法解决这种诡 ...

  2. Django之模型层-单表操作

    单表操作 添加记录 方式1 # 先实例化models中的对象,按照定义的语句规则传入参数,然后使用对象调用save()保存到数据库 book_obj = Book(id=1,title='python ...

  3. 百练1041-反反复复-2016正式C题

    C:反反复复 总时间限制:  1000ms 内存限制:  65536kB 描述 Mo和Larry发明了一种信息加密方法.他们首先决定好列数,然后将信息(只包含字母)从上往下依次填入各列,并在末尾补充一 ...

  4. QT学习相关

    1. vs2012的编译器对execution_character_set("utf-8")无反应的bug在vs2013中解决 2. 安装上vs2013后,重装的qt插件,发现不能 ...

  5. 简易计算器的java实现

    伪代码 public class MainTestwei { 定义两个数组,List<Double> number和 List<Character>calculation分别用 ...

  6. hdu-2196 树形dp 求一个树中所有节点能到达的最远距离f[i] (其实也不难嘛!)

    #include <bits/stdc++.h> using namespace std; ; struct T { int to; int w; }; vector < vecto ...

  7. HDU 1907:John(尼姆博弈变形)

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submi ...

  8. django ---Auth模块

    Auth模块 本文目录 1 Auth模块是什么 2 auth模块常用方法 3 扩展默认的auth_user表 回到目录 1 Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开 ...

  9. oracle 数据库中(创建、解锁、授权、删除)用户

    上文我们已经建立了名为orcl66的数据库. 想要在数据库中创建.修改用户需要我们以管理员权限登录到数据库中. 首先我们通过sqlplus命令登录连接数据库. 输入sqlplus命令--用户名: sy ...

  10. AangularJS入门总结一

    CRUD(增加Create.查询Retrieve.更新Update.删除Delete) 一.angularjs是为了克服HTML在构建应用上的不足而设计的: 二.AngularJS的出众之处: 构建一 ...