PHP_XmlRpc简单实现;

来源:互联网 发布:淘宝教育网视频看不了 编辑:程序博客网 时间:2024/05/16 13:57

> rpc_server.php 文件

<span style="font-size:18px;"><?php/** * PHP XmlRpc_服务端 * 2WorkRoom3 * 谨记:需要开启extension=php_xmlrpc.dll扩展; *//** * 日志:写入log.txt文件日志; * @param $str 日志具体信息; */function fLog($str){    // 注意:\r\n要用双引号引起来才起作用,而单引号不起作用;    //file_put_contents('log.txt', '---'.date('Y-m-d_H:i:s')."---\r\n", FILE_APPEND);    //file_put_contents('log.txt', $str."\r\n\r\n", FILE_APPEND);}/*** rpc_server_func 函数* 函数:提供给RPC客户端调用的函数(通过注册)* 参数:*  $method 客户端需要调用的函数(方法名,注册为这个函数的方法名);*  $params 客户端需要调用的函数的参数数组;*  返回:返回指定调用结果;*/function rpc_server_func($method, $params) {   fLog('$method='.$method);      $parameter = $params[0];   if ($parameter == "get")   {       // 返回给客户端的信息       //$return = "This data by get method.";       $jsondata = '{"id":"23", "name":"2WorkRoom3"}';       $return = $jsondata;   }   else   {       $return = "Not specify method or params.";   }    return $return; } // 1、创建服务器端$xmlrpc_server = xmlrpc_server_create(); // 2、注册服务方法// 注册一个服务器端调用的方法'rpc_server',实际指向的是rpc_server_func函数xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func"); // 接受客户端POST过来的XML数据$request = $HTTP_RAW_POST_DATA;fLog("HTTP_RAW_POST_DATA=$HTTP_RAW_POST_DATA");/* $request 内容 <?xml version="1.0" encoding="iso-8859-1"?> <methodCall> <methodName>rpc_server</methodName> <params> <param> <value> <string>get</string> </value> </param> </params> </methodCall> */// 3、调用请求方法// 执行调用 客户端的XML请求后获取执行结果$xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null); // 4、返回结果信息// 把函数处理后的结果XML进行输出header("Content-Type: text/xml"); // 以xml格式返回;echo $xmlrpc_response;fLog("xmlrpc_response=$xmlrpc_response");/* xmlrpc_response 内容<?xml version="1.0" encoding="iso-8859-1"?><methodResponse><params> <param>  <value>   <string>This data by get method.</string>  </value> </param></params></methodResponse>*/// 5、销毁服务资源xmlrpc_server_destroy($xmlrpc_server); ?></span>


 

>rpc_client.php 文件

<span style="font-size:18px;"><?php/** * PHP XmlRpc_客户端 * 2WorkRoom3 * 谨记:需要开启extension=php_xmlrpc.dll扩展; *//** * 日志:写入log.txt文件日志; * @param $str 日志具体信息; */function fLog($str){    // 注意:\r\n要用双引号引起来才起作用,而单引号不起作用;    //file_put_contents('log.txt', '---'.date('Y-m-d_H:i:s')."---\r\n", FILE_APPEND);    //file_put_contents('log.txt', $str."\r\n\r\n", FILE_APPEND);}/** * rpc_client_call函数 * 函数:提供给客户端进行连接XML-RPC服务器端的函数 * 参数: * $host  需要连接的主机 * $port  连接主机的端口 * $rpc_server XML-RPC服务器端文件 * $request  封装的XML请求信息 * 返回:连接成功,成功返回由服务器端返回的XML信息,失败返回false; */function rpc_client_call($host, $port, $rpc_server, $request) {        // 1、打开网络连接    // 打开指定的服务器端    $fp = fsockopen($host, $port);        // 构建请求信息    // 构造 需要进行通信的  XML-RPC服务器端的  查询POST请求信息    $query = "POST $rpc_server HTTP/1.0\nUser_Agent: XML-RPC Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n";        // 2、发送请求信息    // 把构造好的HTTP协议发送给服务器,失败返回false    if (!fputs($fp, $query, strlen($query))){        $errstr = "Write error";        return false;    }        // 3、接受返回信息    // 获取从服务器端返回的所有信息,包括HTTP头和XML信息    $contents = "";    while (!feof($fp))    {        $contents .= fgets($fp);    }        // 4、关闭网络连接    // 关闭连接资源后返回获取的内容    fclose($fp);    fLog("contents=$contents");    /* $contents 信息    HTTP/1.1 200 OK    Date: Sun, 29 Nov 2015 11:36:59 GMT    Server: Apache/2.4.7 (Win32) OpenSSL/1.0.1e PHP/5.5.9    X-Powered-By: PHP/5.5.9    Content-Length: 183    Connection: close    Content-Type: text/xml        <?xml version="1.0" encoding="iso-8859-1"?>    <methodResponse>    <params>     <param>      <value>       <string>This data by get method.</string>      </value>     </param>    </params>    </methodResponse>    */    return $contents;}/// 服务信息: 构造连接RPC服务器端的信息;$host  = "tiytest.com";$port  = 80;/// 请求文件:RPC服务器端文件路径;$rpc_server = "/rpc_server.php";/// 请求信息:把需要发送的XML请求进行编码成XML,需要调用的方法是rpc_server,参数是get;$request = xmlrpc_encode_request("rpc_server", "get");/// 方法请求:调用rpc_client_call函数把所有请求发送给XML-RPC服务器端后获取信息$response = rpc_client_call($host, $port, $rpc_server, $request);fLog("response=$response");/// 解析结果//  分析从服务器端返回的XML,去掉HTTP头信息,并且把XML转为PHP能识别的字符串.//  这部分在不同的xml返回中,不尽相同,要察看后再填写分隔符。//$split = 'Content-Type: text/xml';$split = "\r\n"; // 报头信息与响应实体有空行,用\r\n表示,记得用双引号引起来,单引号不起作用,以字符串输出;$xml = explode($split, $response);$xml = trim(array_pop($xml));$responsexml = xmlrpc_decode($xml);// 输出从RPC服务器端获取的信息print_r($responsexml);?></span>

 

 

0 0
原创粉丝点击