/** * 接受数据之后的回调方法 * @param swoole_ $serv * @param unknown $fd * @param unknown $from_id * @param unknown $data */ public function onReceive($serv, $fd, $from_id, $data) { $data = StringUtil::decryStr($data, ApiConfig::ENCRYTP_DECRYPT_SALT); $receiveData = \json_decode($data, true); if (empty($receiveData)) { $this->clientResult($serv, $fd, false, '对不起,您上传的数据有误!'); } else { if (isset($receiveData['type']) && $receiveData['type'] == 'server') { switch ($receiveData['action']) { case 'stop': $serv->send($fd, '1'); $serv->close($fd); $serv->shutdown(); break; case 'reload': $serv->send($fd, '1'); $serv->close($fd); $serv->reload(); break; } } elseif (isset($receiveData['type']) && $receiveData['type'] == 'api-call' && isset($receiveData['app']) && isset($receiveData['username']) && isset($receiveData['password']) && isset($receiveData['params'])) { $app = $receiveData['app']; $appConfig = ApiConfig::appsConfig(); if (!isset($appConfig[$app])) { $this->clientResult($serv, $fd, false, '您的应用没有权限访问Api服务器,请联系Api管理员添加您的应用!'); } elseif ($receiveData['username'] != $appConfig[$app]['username'] || $receiveData['password'] != $appConfig[$app]['password']) { $this->clientResult($serv, $fd, false, '您的应用的username或者password错误,请检查!'); } elseif (!isset($receiveData['service']) || !isset($receiveData['method'])) { $this->clientResult($serv, $fd, false, '您没有提交您要请求的服务或者方法,请检查!'); } else { $serviceName = $receiveData['service']; $serviceName = \ucfirst($serviceName) . 'Service'; $serviceName = 'Wx\\Wxserver\\Service\\' . $serviceName; if (!\class_exists($serviceName)) { $this->clientResult($serv, $fd, false, '您要请求的服务不存在,请检查!'); } else { $reflectionClass = new \ReflectionClass($serviceName); $method = $receiveData['method']; if (!$reflectionClass->hasMethod($method)) { $this->clientResult($serv, $fd, false, '您要请求的服务不存在,请检查!'); } else { $reflectionMethod = $reflectionClass->getMethod($method); if (!$reflectionMethod->isPublic()) { $this->clientResult($serv, $fd, false, '您要请求的服务不存在,请检查!'); } else { $apiLogger = ApiLogger::instance(); $start_time = \microtime(true); try { $data = $reflectionMethod->invoke($reflectionClass->newInstance(), $receiveData['params']); $this->clientResult($serv, $fd, true, null, $data); } catch (\Exception $e) { $apiLogger->addError($e->getTraceAsString()); $this->clientResult($serv, $fd, false, $e->getMessage()); } $end_time = \microtime(true); $fdinfo = $serv->connection_info($fd); $apiLogger->addInfo(\json_encode(array('start_time' => $start_time, 'end_time' => $end_time, 'use_time' => $end_time - $start_time, 'serice_name' => $serviceName, 'method_name' => $method, 'params' => $receiveData['params'], 'remote_ip' => $fdinfo['remote_ip'], 'app_name' => $receiveData['app']))); } } } } } else { $this->clientResult($serv, $fd, false, '对不起,您无权访问服务器,提交参数不完整,请检查!'); } } }