예제 #1
0
 private function callRPC($method, $parameters = [])
 {
     $server = new Server(new TestService());
     $input = Packager::pack(['m' => $method, 'p' => $parameters]);
     $response = $server->handle($input['data']);
     return Packager::unpack($response['data']);
 }
예제 #2
0
파일: Server.php 프로젝트: footstones/rpc
 public function handle($service, $data, $request)
 {
     $this->logger->debug('request: ' . $data, $request);
     $response = [];
     try {
         $unpacked = Packager::unpack($data);
         $this->logger->debug('unpacked request', $unpacked);
     } catch (\Exception $e) {
         $response['s'] = Consts::ERR_PACKAGER;
         $response['e'] = ['message' => $e->getMessage()];
         $this->logger->error("unpack error: {$response['e']}", $request);
         goto end;
     }
     $transaction = $unpacked['header']['transactionId'];
     $method = $unpacked['body']['m'];
     $parameters = $unpacked['body']['p'];
     $this->logger->info("{$request['remote_addr']} {$request['request_method']} {$request['request_uri']} {$method}", $parameters);
     if (!is_callable([$service, $method])) {
         $response['s'] = Consts::ERR_REQUEST;
         $response['e'] = ['message' => sprintf("call to undefined api %s::%s", get_class($service), $method)];
         $this->logger->warning('api undefined', $response);
         goto end;
     }
     try {
         ob_start();
         $response['r'] = call_user_func_array([$service, $method], $parameters);
         $response['s'] = Consts::ERR_OKEY;
         $this->logger->debug('api call result', $response);
         $output = ob_get_contents();
         ob_end_clean();
         if (strlen($output) > 0) {
             $response['o'] = $output;
             $this->logger->debug('api call output: ', $output);
         }
     } catch (\Exception $e) {
         $response['s'] = Consts::ERR_EXCEPTION;
         $response['e'] = ['message' => $e->getMessage(), 'code' => $e->getCode(), 'file' => $e->getFile(), 'line' => $e->getLine(), '_type' => get_class($e)];
         $this->logger->warning('api call exception', $response);
     }
     end:
     $this->logger->debug('response', $response);
     $response = Packager::pack($response, isset($transaction) ? $transaction : null);
     return $response;
 }
예제 #3
0
파일: Client.php 프로젝트: footstones/rpc
 public function __call($method, $parameters = [])
 {
     $data = Packager::pack(['m' => $method, 'p' => $parameters]);
     $response = $this->_request($this->_uri, $data['data']);
     if (isset($response['body']['o'])) {
         echo $response['body']['o'];
     }
     switch ($response['body']['s']) {
         case Consts::ERR_OKEY:
             return $response['body']['r'];
         case Consts::ERR_PACKAGER:
             throw new ClientPackagerException($response['body']['e']['message']);
         case Consts::ERR_PROTOCOL:
             throw new ClientPackagerException($response['body']['e']['message']);
         case Consts::ERR_TRANSPORT:
             throw new ClientTransportException($response['body']['e']['message']);
         case Consts::ERR_REQUEST:
         case Consts::ERR_EXCEPTION:
             throw new ServerException($response['body']['e']['message']);
         default:
             throw new ClientException($response['body']['e']['message']);
             break;
     }
 }