编 写:袁 亮
时 间:2015-01-15
说 明:xmlrpc的工作原理和使用
一、为什么需要这个?
1、学名叫远程过程调用,即调用远程其他项目的函数方法
2、例如A项目,里面有用户的图片,在B项目里,我需要获取到这个用户的图片,最老的方法,就是直接连A项目的数据库,重新写一遍获取数据的逻辑。这会带来非常多的问题:
2.1 同样的一个功能,我需要重复写非常多遍
2.2 如果项目要迁移,我都不知道要改多少地方(比如数据库连接等等)
2.3 如果之前的功能稍微做点改动,我得把每个涉及到的项目都得改一遍,然后测试,保证没问题
3、为了解决上述问题,我们希望通过接口的方式去调用其他项目的相应功能,xmlrpc就是其中一种解决办法
soap,或者直接通过http获取数据等,也都可以解决
4、数据采用xml的形式进行传递,
二、工作原理
1、一次服务器与服务器之间的http调用
2、客户端根据相应的参数,构建相应的http请求头信息
3、使用fsockopen发送数据请求,请求数据转为xmlrpc协议格式
4、服务端接收到请求,查看是否有定义相应的函数
5、服务端调用已注册的rpc方法,并输出xml格式的返回值
6、客户端接收到相应的响应数据后,将xml重新解析会php变量
7、rpc过程结束
三、使用范例
1、服务端编写接口
include_once("../inc/class_xmlrpc.php");
function messAdd($m,$p){
$p = $p[0];
$ms = new MessClass;
return $ms->messAdd($p);
}
$xmlrpc_funcs = array(// 注册函数
'messAdd',
);
$xmlrpc_name = 'api/mess';
$xmlrpc_server = new xmlrpc_server();
foreach ($xmlrpc_funcs as $v) {
$xmlrpc_server->register_method($xmlrpc_name.'.'.$v, $v);
}
$xmlrpc_server->call_method();
1.1 引入xmlrpc类
1.2 正常写一个函数,第一个参数预留,封装的类里用到的,第二个参数是客户端传过来的参数
$p[0] $p[1] 分别代表第一、第二个参数,依次类推
1.3 将本地的方法注册,使其可以成为可以被rpc调用的方法
需要一个命名空间,类似api/mess
register_method中,函数名可以不一样,但我习惯会命名成一样的
1.4 查看是否有语法错误
访问下接口地址,是否正常的输出xml格式的数据
2、客户端调用
include_once("../inc/class_xmlrpc.php");
$c = new xmlrpc_client("http://commentdev.ci123.com/mess/rpc/server.php","api/mess");
$p = array(
'to_user_id' => 1535917,
'temp_id' => 134,
'target_id' => 3217,
'platforms' => '1,3',
'user_id' => 2199,
);
$data = $c->call("messAdd",$p);
var_dump($data);
2.1 引用封装的类
2.2 初始化rpc client类
api/mess需要跟服务端那边取的名字保持一致
2.3 调用相应的方法
2.4 这边data只能接受到服务端return的返回值,使用var_dump,echo等输出是不行的
因为那边输出的是函数的返回值,var_dump等并不是函数返回值
2.5 如果是测试机,需要在对应的服务器上加host,在本地加host是没用的
因为这是服务器跟服务器之间的通信(如果在本机上测试,hosts是同一份)
四、常见问题
1、在服务器上调用一个测试服务器的rpc,出错
需要在服务器上加host,因为服务器找不到测试机的域名
2、如果rpc所在服务器加了http basic认证
可以在client初始化的时候,把账号、密码传过去
3、超时时间在客户端初始化的时候设置
4、测试用例保留
客户端调用范例文件保存,在最开始die掉