json rpc 是一种以json为消息格式的远程调用服务,它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。这种远程过程调用可以使用http作为传输协议,也可以使用其它传输协议,传输的内容是json消息体。
下面我们code一套基于php的rpc框架,此框架中包含rpc的服务端server,和应用端client;
(一)PHP服务端RPCserver jsonRPCServer.php
(二)Rpc客户端,jsonRPCClient.php
private $debug;
私人$url;
// 请求id
私人 $id;
私人 $notification = false;
/**
* @param $url
* @param bool $debug
*/
公共函数 __construct($url,$debug = false) {
// 服务器 URL
$this->url = $url;
// 代理
空($代理)? $this->proxy = '' : $this->proxy = $proxy;
// 调试状态
空($调试)? $this->debug = false : $this->debug = true;
// 消息 ID
$this->id = 1;
}
/**
*
* @param boolean $notification
*/
公共函数 setRPCNotification($notification) {
空($通知)? $this->notification = false : $this->notification = true;
}
/**
* @param $method
* @param $params
* @return 布尔
* @抛出异常
*/
公共函数 __call($method,$params) {
// 检验请求信息
if (!is_scalar($method)) {
throw new Exception('方法名称没有标量值');
}
if (is_array($params)) {
$params = array_values($params);
} 其他 {
throw new Exception('参数必须以数组形式给出');
}
if ($this->通知) {
$currentId = NULL;
} 其他 {
$currentId = $this->id;
}
// 拼装成一个请求请求
$request = array( 'method' => $method, 'params' => $params,'id' => $currentId);
$request = json_encode($request);
$this->debug && $this->debug.='***** 请求 *****'."n".$request."n".'***** 请求结束 * ****'."nn";
$opts = array ('http' => array (
'方法' => '发布',
'标题' => '内容类型:application/json',
'内容' => $请求
));
// 关键几部
$context =stream_context_create($opts);
if ( $result = file_get_contents($this->url, false, $context)) {
$response = json_decode($result,true);
} 其他 {
throw new Exception('无法连接到'.$this->url);
}
// 输出调试信息
if ($this->debug) {
echo nl2br(($this->调试));
}
// 检验响应信息
if (!$this->通知) {
// 检查
if ($response['id'] != $currentId) {
throw new Exception('响应 id 不正确(请求 id: '.$currentId.', 响应 id: '.$response['id'].')');
}
if (!is_null($response['error'])) {
throw new Exception('请求错误:'.$response['error']);
}
返回 $response['结果'];
} 其他 {
返回真;
}
}
}
?>
(三)应用实例
(1)服务端server.php
(2)测试类文件,member.php
(3)客户端 client.php
$url = 'http://localhost/rpc/server.php';
$myExample = new jsonRPCClient($url);
// 客户端调用
try {
$name = $myExample->getName();
echo $name ;
} catch (Exception $e) {
echo nl2br($e->getMessage()).'
'."n";
}