swoole创建工作进程,执行滞后工作

一,创建守候进程,因为这里不需要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
时间: 2024-08-12 04:51:56

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

进程管理之工作管理详解(job control)

进程管理之工作管理详解(job control) 1 什么是工作管理(job control) 我们知道linux是多任务多终端工作的操作系统.我们可以在多个终端进行工作,也可以在一个终端进行多个任务工作.那在一个终端同时进行多个工作任务,就称为工作管理.比如这种情况,在一个终端,你想要复制文件,同时你还想压缩打包文件,甚至你还想编辑文件,这个时候就要用到工作管理.工作管理的情况,大概是这样的.直接上图. 首先,你要明白前台,后台的概念.前台就是当前我们登陆shell操作的终端,我们与之交互,看

IIS6与IIS7中的w3wp工作进程

在IIS6中,每一个网站都有对应的应用程序池,在应用程序池有运行着网站的Application,在默认情况下,所有的网站的应用程序都会分配到默认的应用程序池当中, 当然,我们可以新建一个应用程序池,然后更改网站所在的应用程序池. 添加一个应用程序池: 在网站的属性的主目录选项卡下修改网站所在的应用程序池: 查看结果: 因为此时默认的情况下,所有的网站都在同一个应用程序池中,所以它们都会共享同一个w3wp进程,因为在默认的应用程序池中默认设置的Web园的最大进程数为1,如图所示. 此时我们分别访问

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

原博文出于:http://blog.csdn.net/liutengteng130/article/details/46700999  感谢! Nginx由一个master进程和多个worker进程组成,但master进程或者worker进程中并不会再创建线程. 一.master进程和worker进程的作用 master进程 不需要处理网络事件,不负责业务的执行,只会通过管理worker等子进程来实现重启服务.平滑升级.更换日志文件.配置文件实时生效等功能. master是通过fork系统调用子

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

Nginx由一个master进程和多个worker进程组成,但master进程或者worker进程中并不会再创建线程. 一.master进程和worker进程的作用 master进程 不需要处理网络事件,不负责业务的执行,只会通过管理worker等子进程来实现重启服务.平滑升级.更换日志文件.配置文件实时生效等功能. master是通过fork系统调用子进程来实现和子进程的通信. worker进程 用来处理master进程fork过来的请求 worker进程是通过处理信号来实现和master通信

Linux内核设计与实现 阅读笔记:8、下半部和推后执行的工作

By:Ailson Jack Date:2016.04.10 个人博客:www.only2fire.com 本文在我博客的地址是:http://www.only2fire.com/archives/871.html,排版更好,便于学习. 上一章简单的讲了一下中断的上半部(中断处理程序),这一章就讲讲中断的下半部以及下半部的几种实现机制,最后简单的写了几个测试的例子来测试软中断.tasklet和工作队列. 测试程序下载地址:. 1.下半部简述 中断下半部的任务是执行与中断处理密切相关但中断处理程序

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

一.首先我们来看看进程控制块PCB也就是task_struct,(源码) 选出task_struct中几个关键的参数进行分析 struct task_struct {volatile long state; //进程状态 /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; //进程内核堆栈 atomic_t usage; unsigned int flags; //进程标识符 /* per process flags, defined

Linux进程创建、可执行文件的加载和进程执行进程切换

作者:刘磊 文中参考代码出处:https://github.com/mengning/linuxkernel/ 本文主要针对进程创建.可执行文件的加载和进程间切换三大部分进行实验并分析. 实验环境:Ubuntu 16虚拟机.VMware 14 1 进程创建 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代面向线程设计的计算机结构中,进程是线程的容器.程

Nginx工作进程模型

前面提到过,Nginx不为每个连接派生进程或线程,而是由worker进程通过监听共享套接字接受新请求,并且使用高效的循环来处理数千个连接.Nginx不使用仲裁器或分发器来分发连接,这个工作由操作系统内核机制完成.监听套接字在启动时就完成初始化,worker进程通过这些套接字接受.读取请求和输出响应. 事件处理循环是Nginx worker代码中最复杂的部分,它包含复杂的内部调用,并且严重依赖异步任务处理的思想.异步操作通过模块化.事件通知.大量回调函数以及微调定时器等实现.总的来说,基本原则就是

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

IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫“IIS限制连接数” 这边客户请求的连接内容包括: 1.网站html请求,html中的图片资源,html中的脚本资源,其他需要连接下载的资源等等,任何一个资源的请求即一次连接(虽然有的资源请求连接响应很快) 2.如果网页采用框架(框架内部嵌套网页请求),那么一个框架即一次连接 3.如果网页弹出窗口(窗口内部嵌