/** * 网关有消息时,判断消息是否完整 */ public static function onGatewayMessage($buffer) { if ($buffer[0] == '{') { return JsonProtocol::check($buffer); } else { return TextProtocol::check($buffer); } }
/** * 服务端接收数据 * * @param $serv swoole_server对象 * @param $fd 连接的描述符 * @param $from_id reactor的id,无用 * @param $data 接收数据 */ public function onReceive(swoole_server $serv, $fd, $from_id, $data) { //检测数据完整性 if (JsonProtocol::check($data) != 0) { return; } $data = JsonProtocol::decode($data); //接收参数 $class = $data['class']; $method = $data['method']; $params = $data['params']; $startTime = $this->microtimeFloat(); // 判断类对应文件是否载入 if (!class_exists($class)) { $include_file = ROOT_DIR . "Server/{$class}.php"; if (is_file($include_file)) { require_once $include_file; } if (!class_exists($class)) { $code = 404; $msg = "class {$class} not found"; $result = array('code' => $code, 'msg' => $msg, 'data' => null); $serv->send($fd, JsonProtocol::encode($result)); } } // 调用类的方法 try { $ret = call_user_func_array(array(new $class(), $method), $params); $code = $ret['code']; $msg = $ret['msg']; // 发送数据给客户端,调用成功,data下标对应的元素即为调用结果 $serv->send($fd, JsonProtocol::encode($ret)); } catch (Exception $e) { // 发送数据给客户端,发生异常,调用失败 $code = $e->getCode() ? $e->getCode() : 500; $msg = $e->getMessage(); $result = array('code' => $code, 'msg' => $msg, 'data' => $e); $serv->send($fd, JsonProtocol::encode($result)); } //请求数据统计,放在task执行 $executionTime = $this->microtimeFloat() - $startTime; $report = array('class' => $class, 'method' => $method, 'params' => json_encode($params), 'code' => $code, 'msg' => $msg, 'execution' => $executionTime, 'time' => time()); $serv->task(json_encode($report)); }