Пример #1
0
 /**
  * 处理master发过来的命令
  * @param resource $socket
  * @param int $flag
  */
 public function dealCmd($channel, $length, $buffer)
 {
     // 主进程挂了,完蛋了
     if ($length == 0) {
         $this->event->delAll($this->channel);
         $this->notice("!!!!!!!!!!!!!!!!!!!!Master has gone !!!!!!!!!!!!!!!!!");
         $this->onMasterDead();
         return false;
     }
     // master发过来的命令字只有一个字节
     $cmd = Cmd::decodeForWorker($buffer);
     // 判断是哪个命令字
     switch ($cmd) {
         // 测试
         case Cmd::CMD_TEST:
             $this->reportToMaster($cmd, 'test ok');
             break;
             // 获取该worker进程包含的文件
         // 获取该worker进程包含的文件
         case Cmd::CMD_REPORT_INCLUDE_FILE:
             $files = get_included_files();
             $this->reportToMaster($cmd, $files);
             $this->onAlarm();
             break;
             // 命令该worker停止服务
         // 命令该worker停止服务
         case Cmd::CMD_STOP_SERVE:
             $this->reportToMaster($cmd, 1);
             $this->stopServe();
             break;
             // 命令重启服务
         // 命令重启服务
         case Cmd::CMD_RESTART:
             $this->reportToMaster($cmd, 1);
             $this->stopServe();
             break;
             // 命令关闭通信管道
         // 命令关闭通信管道
         case Cmd::CMD_CLOSE_CHANNEL:
             break;
             // 命令上报worker状态信息给master
         // 命令上报worker状态信息给master
         case Cmd::CMD_REPORT_STATUS_FOR_MASTER:
             $this->reportToMaster($cmd, array_merge($this->statusInfo, array('memory' => memory_get_usage(true))));
             break;
             // 上报worker状态信息给FileMonitor
         // 上报worker状态信息给FileMonitor
         case Cmd::CMD_REPORT_WORKER_STATUS:
             Reporter::reportWorkerStatus(array_merge($this->statusInfo, array('memory' => memory_get_usage(true), 'worker_name' => get_class($this))));
             break;
         case Cmd::CMD_PING:
             $this->reportToMaster(Cmd::CMD_PONG, '');
             $this->onAlarm();
             break;
             // 未知命令
         // 未知命令
         default:
             $this->reportToMaster(Cmd::CMD_UNKNOW, 'CMD UNKONW!!');
     }
 }