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