xmlrpc 远程过程调用, 使用xml文本方式传输数据.
soap协议比xmlrpc复杂并强大.
1.修改 php.ini,开启 xmlrpc 扩展
2.rpc_client.php
<?php
function xmlrpc_call($host, $port, $server_file, $request) {
//打开指定的服务器端
$fp = fsockopen($host, $port, $errno, $errstr);
//构造需要进行通信的XML-RPC服务器端的查询POST请求信息
$query = "POST ".$server_file." HTTP/1.0\n";
$query .= "User_Agent: My Egg Client\n";
$query .= "Host: ".$host."\n";
$query .= "Content-Type: text/xml\n";
$query .= "Content-Length: ".strlen($request)."\n\n"; // 必须是两个 \n !!
$query .= $request."\n";
//把构造好的HTTP协议发送给服务器,失败返回false
if (!fputs($fp, $query, strlen($query))) {
$errstr = "Write error";
return 0;
}
//获取从服务器端返回的所有信息,包括HTTP头和XML信息
$contents = '';
while (!feof($fp)) {
$contents .= fgets($fp);
}
//关闭连接资源后返回获取的内容
fclose($fp);
// 分析从服务器端返回的XML,去掉HTTP头信息,并且把XML转为PHP能识别的字符串
$split = '<?xml version="1.0" encoding="iso-8859-1"?>';
$xml = explode($split, $contents);
$xml = $split . array_pop($xml);
$contents = xmlrpc_decode($xml);
return $contents;
}
//构造连接RPC服务器端的信息
$host = 'localhost'; // PRC服务器主机地址
$port = 80; // PRC服务器主机端口
$server_file = '/rpc_server.php'; // 左斜杠不能少!!
$request = xmlrpc_encode_request('cycle', 'aaa'); // 把需要发送的XML请求进行编码: 调用的方法是cycle, 参数是egg
//调用 xmlrpc_call 函数把所有请求发送给XML-RPC服务器端, 并获取返回值
$response = xmlrpc_call($host, $port, $server_file, $request);
print_r($response);
3.rpc_server.php
<?php
function lifecycle($method, $params) {
switch($params[0]) {
default:
$reply = 'You post string is '.$params[0];
}
return $reply;
}
$server = xmlrpc_server_create(); // 产生一个XML-RPC的服务器端
$func_name_client = 'cycle';
$func_name_server = 'lifecycle';
xmlrpc_server_register_method($server, $func_name_client, $func_name_server); // 注册一个供RPC客户端调用的名称: cycle
$request = $HTTP_RAW_POST_DATA; // 接收RPC客户端传递过来的数据
// 调用RPC服务器的处理函数
$response = xmlrpc_server_call_method($server, $request, null);
// 返回结果给RPC客户端
header('Content-Type: text/xml');
print $response;
//销毁XML-RPC服务器端资源
xmlrpc_server_destroy($server);
4.访问:localhost/rpc_client.php, 返回值为
You post string is egg
;