PHP 中集成了XML-RPC和 SOAP 两种 Web Service 通信两种协议标准,基本的思想就是使用基于 XML 的 HTTP 的远程调用提供一种标准的机制,而省去建立一种新协议的需求。其实这在实际开发应用中是非常实用,比如 PC 客户端或者现在流行的手机客户端需要同服务器端通信,这时候 XML-RPC 就是一个很好的解决办法。

这里记一下的 PHP 中如何使用 XML-RPC 的笔记,虽然这种方式运用的不多。

基本原理就是 XML-RPC 使用 XML 来进行通信。首先构造一个 RPC 服务器端用来出来从 RPC 客户端传递过来的使用 XML 封装的请求,并且把处理结果通过 XML 的形式返回给 RPC 客户端,客户端就去分析 XML 获取自己需要的数据。XML-RPC 的服务器端必须有现成的函数提供给客户端调用,并且客户端提交的请求中的函数和方法必须和服务器端的一致,否则将无法获取所需要的结果。

首先要确保你的 PHP 支持 XML-RPC 扩展,如果没有可以请安装,windows 下 php_xmlrpc.dll 放到你的 PHP 扩展目录下,Linux 重新编译 PHP,在 configure 的时候请加入 –with-xmlrpc 选项,因为我用的是 Ubuntu,所以直接 sudo apt-get install php5-xmlrpc 就可以了。

服务器段代码如下,注释详细:

/* server.php
* @function 提供给RPC客户端调用的函数
* @param   string  $method 客户端需要调用的函数
* @param   array   $params 客户端需要调用的函数的参数数组
* return   string  返回调用结果
*/
function rpc_server_func($method, $params) {
$parameter = $params[0];
if ($parameter == "get") {
$return = 'This data by get method';
} else {
$return = 'Not specify method or params';
}
return $return;
}

//产生XML-RPC的服务器端
$xmlrpc_server = xmlrpc_server_create();
//注册一个服务器端调用的方法rpc_server,实际指向的是rpc_server_func函数
xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func");
//接受客户端POST过来的XML数据
$request = $HTTP_RAW_POST_DATA;
//执行调用客户端的XML请求后获取执行结果
$xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null);
//把函数处理后的结果XML进行输出
header('Content-Type: text/xml');
echo $xmlrpc_response;
//销毁XML-RPC服务器端资源
xmlrpc_server_destroy($xmlrpc_server);

服务器端代码如下,注释详细:

/* client.php
* @function    提供给客户端进行连接XML-RPC服务器端的函数
* @param   string  $host  需要连接的主机
* @param   string  $port  连接主机的端口
* @param   string  $rpc_server XML-RPC服务器端文件
* @param   $request  封装的XML请求信息
* return   成功返回由服务器端返回的XML信息,失败返回false
*/
function rpc_client_call($host, $port, $rpc_server, $request) {
//打开指定的服务器端
$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";
//把构造好的HTTP协议发送给服务器,失败返回false
if (!fputs($fp, $query, strlen($query))) {
$errstr = "Write error";
return false;
}
//获取从服务器端返回的所有信息,包括HTTP头和XML信息
$contents = "";
while (!feof($fp)) {
$contents .= fgets($fp);
}
//关闭连接资源后返回获取的内容
fclose($fp);
return $contents;
}
//构造连接RPC服务器端的信息
$host = 'localhost';
$port = 80;
$rpc_server = '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);
//分析从服务器端返回的XML,去掉HTTP头信息,并且把XML转为PHP能识别的字符串
$split = "";
$xml = explode($split, $response);
$xml = $split . array_pop($xml);
$response = xmlrpc_decode($xml);
//输出从RPC服务器端获取的信息
print_r($response);

通过过 xmlrpc_decode 函数把这个 XML 编码为 PHP 的字符串以便处理,整个 Web Service 交互完成。

XML-RPC 函数参考:

转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记

如果觉得本篇文章对您十分有益,何不 打赏一下

谢谢打赏

本文链接地址: PHP 中 XML-RPC 使用笔记

知识共享许可协议 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可