zoukankan      html  css  js  c++  java
  • 【多进程】php实现 master-worker 守护多进程模式

    <?php
    
    class Worker{
    
        public static $count = 2;
    
        public static function runAll(){
            static::runMaster();
            static::moniProcess();
        }
    
        //开启主进程
        public static function runMaster(){
            //确保进程有最大操作权限
            unmask(0);
            $pid = pcntl_fork();
            if($pid > 0){
                echo "主进程进程 $pid 
    ";
                exit;    
            }else if($pid == 0){
                if(-1 === posix_setsid()){
                        throw new Exception("setsid fail");
                }
    
                for ($i=0; $i < self::$count; $i++) {
                    static::runWorker();
                }
    
                @cli_set_process_title("master_process");
    
                
            }else{
                throw new Exception("创建主进程失败");
            }
        } 
    
        //开启子进程
        public static function runWorker(){
            unmask(0);
            $pid = pcntl_fork();
            if($pid > 0){
                // echo "创建子进程 $pid 
    ";
            }else if($pid == 0){
                if(-1 === posix_setsid()){
                    throw new Exception("setsid fail");
                }
                @cli_set_process_title("worker_process");
                while(1){
                    sleep(1);
                }
            }else{
                throw new Exception("创建子进程失败");
            }
        }
    
        //监控worker进程
        public function moniProcess(){
            while( $pid = pcntl_wait($status)){
                if($pid == -1){
                    break;
                }else{
                    static::runWorker();
                }
            }
        }
    }
    
    Worker::runAll();
    ps -aux
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0  18200  3076 pts/0    Ss+  14:05   0:00 bash
    root         6  0.0  0.0  18208  3252 pts/1    Ss   14:06   0:00 bash
    root        19  0.0  0.0  18204  3248 pts/2    Ss+  14:11   0:00 bash
    root        64  0.0  0.2 348488  8320 ?        Ss   15:32   0:00 master_process
    root        65  0.0  0.2 348488  8400 ?        Ss   15:32   0:00 worker_process
    root        66  0.0  0.2 348488  8400 ?        Ss   15:32   0:00 worker_process
    root        67  0.0  0.0  36640  2804 pts/1    R+   15:32   0:00 ps -aux

    执行命令 kill 65,杀死进程 65 则master_process 进程会再自动开启一个子进程

    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0  18200  3076 pts/0    Ss+  14:05   0:00 bash
    root         6  0.0  0.0  18208  3252 pts/1    Ss   14:06   0:00 bash
    root        19  0.0  0.0  18204  3248 pts/2    Ss+  14:11   0:00 bash
    root        64  0.0  0.2 348488  8320 ?        Ss   15:32   0:00 master_process
    root        66  0.0  0.2 348488  8400 ?        Ss   15:32   0:00 worker_process
    root        68  0.0  0.1 348488  5796 ?        Ss   15:34   0:00 worker_process
    root        69  0.0  0.0  36640  2728 pts/1    R+   15:34   0:00 ps -aux
  • 相关阅读:
    关于各种编程语言调用C星寻路插件的例子
    练习作品11:语音识别 准确度70%
    练习作品10:被一个傻叉坑了 要求把串口 封装到DLL中调用;
    Dynamics CRM 构建IN查询
    初识Spark2.0之Spark SQL
    从Dynamics CRM2011到Dynamics CRM2016的升级之路
    Dynamics CRM2011 导入解决方案报根组件插入错误的解决方法
    基于hadoop的BI架构
    Dynamics CRM 不同的站点地图下设置默认不同的仪表板
    Dynamics CRM 打开数据加密报错及修改用户邮件保存报错的解决方法
  • 原文地址:https://www.cnblogs.com/itsuibi/p/11189234.html
Copyright © 2011-2022 走看看