基于php的json rpc原理及应用

json rpc

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

(一)PHP服务端RPCserverjsonRPCServer.phpclass jsonRPCServer {/***处理一个request类,,这个类中绑定了一些请求参数* @param object $object* @return boolean*/public static function handle($object) {// 判断是否是一个rpc json请求if ($_SERVER['REQUEST_METHOD'] != 'POST' || empty($_SERVER['CONTENT_TYPE'])||$_SERVER['CONTENT_TYPE'] != 'application/json') {return false;}// reads the input data$request = json_decode(file_get_contents('php://input'),true);// 执行请求类中的接口try {if ($result = @call_user_func_array(array($object,$request['method']),$request['params'])) {$response = array ( 'id'=> $request['id'],'result'=> $result,'error'=> NULL );} else {$response = array ( 'id'=> $request['id'], 'result'=> NULL,'error' => 'unknown method or incorrect parameters' );}} catch (Exception $e) {$response = array ('id' => $request['id'],'result' => NULL, 'error' =>$e->getMessage());}// json 格式输出if (!empty($request['id'])) { // notifications don't want responseheader('content-type: text/javascript');echo json_encode($response);}return true;}}(二)Rpc客户端,jsonRPCClient.php<?php/* */class jsonRPCClient {private $debug;private $url;// 请求idprivate $id;private $notification = false;/*** @param $url* @param bool $debug*/public function __construct($url,$debug = false) {// server URL$this->url = $url;// proxyempty($proxy) ? $this->proxy = '' : $this->proxy = $proxy;// debug stateempty($debug) ? $this->debug = false : $this->debug = true;// message id$this->id = 1;}/**** @param boolean $notification*/public function setRPCNotification($notification) {empty($notification) ? $this->notification = false : $this->notification = true;}/*** @param $method* @param $params* @return bool* @throws Exception*/public function __call($method,$params) {// 检验request信息if (!is_scalar($method)) {throw new Exception('Method name has no scalar value');}if (is_array($params)) {$params = array_values($params);} else {throw new Exception('Params must be given as array');}if ($this->notification) {$currentId = NULL;} else {$currentId = $this->id;}// 拼装成一个request请求$request = array( 'method' => $method, 'params' => $params,'id' => $currentId);$request = json_encode($request);$this->debug && $this->debug.='***** Request *****'."\n".$request."\n".'***** End Of request *****'."\n\n";$opts = array ('http' => array ('method' => 'POST','header' => 'Content-type: application/json','content' => $request));// 关键几部$context = stream_context_create($opts);if ( $result = file_get_contents($this->url, false, $context)) {$response = json_decode($result,true);} else {throw new Exception('Unable to connect to '.$this->url);}// 输出调试信息if ($this->debug) {echo nl2br(($this->debug));}// 检验response信息if (!$this->notification) {// checkif ($response['id'] != $currentId) {throw new Exception('Incorrect response id (request id: '.$currentId.', response id: '.$response['id'].')');}if (!is_null($response['error'])) {throw new Exception('Request error: '.$response['error']);}return $response['result'];} else {return true;}}}?>(三) 应用实例(1)服务端 server.php<?php<span style="white-space:pre"></span>require_once 'jsonRPCServer.php';// member 为测试类<span style="white-space:pre"></span>require 'member.php';<span style="white-space:pre"></span>// 服务端调用<span style="white-space:pre"></span>$myExample = new member();<span style="white-space:pre"></span>// 注入实例<span style="white-space:pre"></span>jsonRPCServer::handle($myExample)or print 'no request';?>(2)测试类文件,member.php

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

(3)客户端 client.php

require_once 'jsonRPCClient.php';$url = '';$myExample = new jsonRPCClient($url);// 客户端调用try {$name = $myExample->getName();echo $name ;} catch (Exception $e) {echo nl2br($e->getMessage()).'<br />'."\n";}

在你生活出现失意和疲惫时能给你一点儿力量和希冀,只愿你幸福快乐。

基于php的json rpc原理及应用

相关文章:

你感兴趣的文章:

标签云: