Exemplo n.º 1
0
 /**
  * 接受数据之后的回调方法
  * @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, '对不起,您无权访问服务器,提交参数不完整,请检查!');
         }
     }
 }