RPC
远程过程调用,简单的说,就是A服务器上需要执行一个过程(函数)。向B服务器请求,B服务器执行这个过程,把结果返回A服务器。这个整个过程对用户来讲是透明的,也就是说,用户只关注A服务器上,不需要关心这个(过程)函数是在A服务器执行。
XML-RPC
XML-RPC是Userland Software公司设计的一种格式:是一种使用HTTP协议传输XML格式文件来获取远程程序调用(Remote Procedure Call)的传输方式。官方网站是www.xmlrpc.com。
在http://phpxmlrpc.sourceforge.net/上面有个PHP XML-RPC的框架(类集合)用于使用PHP语言来写XML-RPC客户端和服务端。现在的稳定发行版本是2.2,下载地址是http://sourceforge.net/projects/phpxmlrpc/files/phpxmlrpc/2.2.2/xmlrpc-2.2.2.tar.gz/download。
ThinkPHP
和TP结合的话,把lib包放入vendor。
我这里把源服务器和目标服务器都放入同一个文件里了。
代码如下:
[php]
/**
* 这是一个XML-RPC的最简单的例子。
* 没有具体调试,用的时候需要再进一步调试。
*/
class rpcAction extends commonAction {
public function __construct() {
parent::__construct();
vendor(‘RPC.xmlrpc’, "", ".inc");
vendor(‘RPC.xmlrpcs’, "", ".inc");
}
/**
* 主要的处理函数,把参数从远端传过来,转换成php格式
* 再转换成XMLRPC格式,传输回去
* @param $xmlrpcmsg
* @return xmlrpcresp
*/
function foo($xmlrpcmsg) {
$par1 = $xmlrpcmsg->getParam(0); //获取第一个参数
$val1 = $par1->scalarval(); //转换成PHP对应的值
$par2 = $xmlrpcmsg->getParam(1); //获取第二个参数
$val2 = $par2->scalarval(); //转换成PHP对应的值
$par3 = $xmlrpcmsg->getParam(2); //获取第二个参数
//转换成PHP对应的值
for ($i = 0; $i < $par3->arraySize(); $i++) {
$v = $par3->arrayMem($i);
$val[] = $v->scalarVal() . "
";
}
$msg1 = new xmlrpcval(strrev($val1), "string");
$msg2 = new xmlrpcval(strrev($val2), "int");
$msg = new xmlrpcval(array($msg1, $msg2), "array"); //返回一个array
return new xmlrpcresp($msg);
}
/**
* 这个是目的服务器发送数据的
*/
public function set() {
new xmlrpc_server(
array(
"example.test" => array("function" => "foo"),
)
);
}
/**
* 这个是源服务器请求的
*/
function get() {
$params = array(
new xmlrpcval("hello rpc", "string"),
new xmlrpcval(123, "int"),
new xmlrpcval(
array(
new xmlrpcval("test", "string"),
new xmlrpcval(456, "int")
),
"array"),
);
$message = new xmlrpcmsg("example.test", $params);
$client = new xmlrpc_client("/set", "www.hoteltour.new", ’80′);
//$client->setDebug(2);
$res = $client->send($message, 30);
if (!$res->faultCode()) {
$v = $res->value();
for ($i = 0; $i < $v->arraySize(); $i++) {
$vv = $v->arrayMem($i);
echo $vv->scalarVal() . "
";
}
} else {
echo $res->faultcode() . ":" . $res->faultString() . "
";
}
}
}
[/php]
资料参考:
http://www.cnblogs.com/codebean/archive/2011/07/27/2118446.html
http://www.xmlrpc.com/