当前位置:首页 > PHP教程 > php高级应用 > 列表

php实现的一个简单json rpc框架实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-18 21:43:04 浏览: 评论:0 

json rpc 是一种以json为消息格式的远程调用服务,它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。这种远程过程调用可以使用http作为传输协议,也可以使用其它传输协议,传输的内容是json消息体。

下面我们code一套基于php的rpc框架,此框架中包含rpc的服务端server,和应用端client;

(一)PHP服务端RPCserver jsonRPCServer.php

代码如下:

  1. class jsonRPCServer { 
  2.     /** 
  3.      *处理一个request类,这个类中绑定了一些请求参数 
  4.      * @param object $object 
  5.      * @return boolean 
  6.      */ 
  7.     public static function handle($object) { 
  8.        // 判断是否是一个rpc json请求 
  9.         if ($_SERVER['REQUEST_METHOD'] != 'POST' || emptyempty($_SERVER['CONTENT_TYPE']) 
  10.             ||$_SERVER['CONTENT_TYPE'] != 'application/json') { 
  11.             return false; 
  12.         } 
  13.         // reads the input data 
  14.         $request = json_decode(file_get_contents('php://input'),true); 
  15.         // 执行请求类中的接口 
  16.         try { 
  17.             if ($result = @call_user_func_array(array($object,$request['method']),$request['params'])) { 
  18.                 $response = array ( 'id'=> $request['id'],'result'=> $result,'error'=> NULL ); 
  19.             } else { 
  20.                 $response = array ( 'id'=> $request['id'], 'result'=> NULL, 
  21.                                         'error' => 'unknown method or incorrect parameters' );} 
  22.         } catch (Exception $e) { 
  23.             $response = array ('id' => $request['id'],'result' => NULL, 'error' =>$e->getMessage()); 
  24.         } 
  25.        // json 格式输出 
  26.         if (!emptyempty($request['id'])) { // notifications don't want response 
  27.             header('content-type: text/javascript'); 
  28.             echo json_encode($response); 
  29.         } 
  30.         return true; 
  31.     } 

(二)Rpc客户端,jsonRPCClient.php 代码如下:

  1. <?php 
  2. /* 
  3.  */ 
  4. class jsonRPCClient { 
  5.     private $debug
  6.     private $url
  7.     // 请求id 
  8.     private $id
  9.     private $notification = false; 
  10.     /** 
  11.      * @param $url 
  12.      * @param bool $debug 
  13.      */ 
  14.     public function __construct($url,$debug = false) { 
  15.         // server URL 
  16.         $this->url = $url
  17.         // proxy 
  18.         emptyempty($proxy) ? $this->proxy = '' : $this->proxy = $proxy
  19.         // debug state 
  20.         emptyempty($debug) ? $this->debug = false : $this->debug = true; 
  21.         // message id 
  22.         $this->id = 1; 
  23.     } 
  24.  
  25.     /** 
  26.      * 
  27.      * @param boolean $notification 
  28.      */ 
  29.     public function setRPCNotification($notification) { 
  30.         emptyempty($notification) ? $this->notification = false  : $this->notification = true; 
  31.     } 
  32.  
  33.     /** 
  34.      * @param $method 
  35.      * @param $params 
  36.      * @return bool 
  37.      * @throws Exception 
  38.      */ 
  39.     public function __call($method,$params) { 
  40.         // 检验request信息 
  41.         if (!is_scalar($method)) { 
  42.             throw new Exception('Method name has no scalar value'); 
  43.         } 
  44.         if (is_array($params)) { 
  45.             $params = array_values($params); 
  46.         } else { 
  47.             throw new Exception('Params must be given as array'); 
  48.         } 
  49.  
  50.         if ($this->notification) { 
  51.             $currentId = NULL; 
  52.         } else { 
  53.             $currentId = $this->id; 
  54.         } 
  55.  
  56.        // 拼装成一个request请求 
  57.         $request = array(  'method' => $method,  'params' => $params,'id' => $currentId); 
  58.         $request = json_encode($request); 
  59.         $this->debug && $this->debug.='***** Request *****'."\n".$request."\n".'***** End Of request *****'."\n\n"
  60.         $opts = array ('http' => array ( 
  61.                                     'method'  => 'POST'
  62.                                     'header'  => 'Content-type: application/json'
  63.                                     'content' => $request 
  64.         )); 
  65.         //  关键几部 
  66.         $context  = stream_context_create($opts); 
  67.   if ( $result = file_get_contents($this->url, false, $context)) { 
  68.             $response = json_decode($result,true); 
  69.   } else { 
  70.    throw new Exception('Unable to connect to '.$this->url); 
  71.   } 
  72.         // 输出调试信息 
  73.         if ($this->debug) { 
  74.             echo nl2br(($this->debug)); 
  75.         } 
  76.         // 检验response信息 
  77.         if (!$this->notification) { 
  78.             // check 
  79.             if ($response['id'] != $currentId) { 
  80.                 throw new Exception('Incorrect response id (request id: '.$currentId.', response id: '.$response['id'].')'); 
  81.             } 
  82.             if (!is_null($response['error'])) { 
  83.                 throw new Exception('Request error: '.$response['error']); 
  84.             } 
  85.             return $response['result']; 
  86.  
  87.         } else { 
  88.             return true; 
  89.         } 
  90.     } 
  91. ?> 

(三) 应用实例

(1)服务端 server.php

代码如下:

  1. <?php 
  2. require_once 'jsonRPCServer.php'
  3. 复制代码代码如下: 
  4.  
  5. // member 为测试类 
  6. require 'member.php'
  7. // 服务端调用 
  8. $myExample = new member(); 
  9. // 注入实例 
  10. jsonRPCServer::handle($myExample
  11.  or print 'no request'
  12. ?> 

(2)测试类文件,member.php 代码如下:

  1. class member{ 
  2.     public function getName(){ 
  3.         return 'hello word ' ;  // 返回字符串 
  4.     } 

(3)客户端 client.php 代码如下:

  1. require_once 'jsonRPCClient.php'
  2. $url = 'http://localhost/rpc/server.php'
  3. $myExample = new jsonRPCClient($url); 
  4.  
  5. // 客户端调用 
  6. try { 
  7.  $name = $myExample->getName(); 
  8.     echo $name ; 
  9. } catch (Exception $e) { 
  10.  echo nl2br($e->getMessage()).'<br />'."\n"
  11. }

Tags: json rpc框架

分享到: