1、XMLRPC概念
xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。一个rpc系统,必然包括2个部分:
1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;
2.rpc server,用于响应rpcclient的请求,执行方法,并回送方法执行结果。RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。
2、搭建RPC服务端
首先定义服务器中运行的方法,然后创建xml rpc对象,注册两个方法,获取从客户端传来的数据,服务器传过来的数据是一个xml请求数据,最后调用服务器中的方法,返回的数据格式也是xml数据格式。
<?php
//定义可以被访问的方法
function hello(){
return 'hello world!';
}
//rpc server在调用函数时调用的参数是
// array(0=>'函数名',1=>array(实参1,实参2,实参3....),2=>NULL)
function sum($method,$args,$extra){
return array_sum($args);
}
//创建xmlrpc Server
$server = xmlrpc_server_create();
xmlrpc_server_register_method($server, 'hello', 'hello');
xmlrpc_server_register_method($server, 'sum', 'sum');
//收取请求
$request = $HTTP_RAW_POST_DATA;
//调用方法
$response = xmlrpc_server_call_method($server, $request, null);
//输出数据
header('Content-type:text/xml;charset=utf-8');
echo $response;
//销毁xmlrpc Server资源
xmlrpc_server_destroy($server);
?>
3、搭建RPC客户端
首先定义了一个类,名为RpcClient,类中主要有3个方法,一个为__call方法,这是一个魔术方法,当调用类中不存在的方法时就会触发此模式方法,将方法名和参数包装成xml数据,然后调用类中的第二个方法__query方法,在该方法中包装一个http post请求,请求携带的数据就为__call方法中形成的xml数据,然后访问该请求。最后将获得的xml数据解析为php格式。
<?php
class RpcClient{
private $url;//xmlrpc server的地址
//构造方法
public function __construct($url = ''){
$this->url = $url;
}
//请求远程服务器
private function __query($request){
$context = stream_context_create(
array(
'http'=>array(
'method'=>'POST',
'header'=>'Content-type:text/xml',
'content'=>$request
)
)
);
return xmlrpc_decode(file_get_contents($this->url,false,$context));
}
//魔术方法
public function __call($method,$params){
$request = xmlrpc_encode_request($method, $params);
return $this->__query($request);
}
}
//测试调用
header('Content-type:text/html;charset=utf-8');
$client = new RpcClient('http://localhost/booledu/webservice/xmlrpc_server.php');
echo 'hello方法:'.$client->hello().'<br/>';//调用远程服务器中的hello方法
echo 'sum方法:'.$client->sum(1,2,3);//调用远程服务器中的sum方法
?>
运行结果: