/** * 处理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!!'); } }