加入收藏 | 设为首页 | 会员中心 | 我要投稿 四平站长网 (https://www.0434zz.com.cn/)- 云服务器、对象存储、基础存储、视频终端、数据应用!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php实现 master-worker 守护多进程模式

发布时间:2022-08-02 14:31:23 所属栏目:PHP教程 来源:互联网
导读:?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
  <?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 n";
              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 n";
          }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

(编辑:四平站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读