RPC接口的使用


编	写:袁	亮
时	间: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掉


发表评论