当前位置: 代码迷 >> 综合 >> PHP XMLRPC 实践
  详细解决方案

PHP XMLRPC 实践

热度:79   发布时间:2024-01-12 09:02:28.0
PHP XMLRPC 实践
2007-06-08 16:54

    公司需要连接远程调用, 完全不了,Google之 终于找到 一个PHP的XMLRPC库,

sf上的编辑推荐 http://phpxmlrpc.sourceforge.net/ 包

协议 网站 www.xmlrpc.com

XMLRPC其实就是 一个 Http请求到一个服务器 服务器返回一个XML页面的过程,只是大家遵守同样的格式 这样大家就可以互相调用了。

发送:

POST /test/xmlrpc/server.php HTTP/1.0
User-Agent: XML-RPC for PHP 2.2
Host: localhost:80
Accept-Encoding: gzip, deflate
Accept-Charset: UTF-8,ISO-8859-1,US-ASCII
Content-Type: text/xml
Content-Length: 163
<?xml version="1.0"?>
<methodCall>
<methodName>saySomething</methodName>
<params>
<param>
<value><string> 成都天气 很不错!又要下雨了</string></value>
</param>
</params>
</methodCall>
methodCall 方法名
params 参数
param 参数    string 数据类型

服务器接收到请求后用给的参数执行请求的方法按照协议格式返回数据:

HEADER: date: Fri, 08 Jun 2007 08:33:14 GMT
HEADER: server: Apache/2.0.54 (Win32)
HEADER: x-powered-by: PHP/4.3.11
HEADER: content-encoding: gzip
HEADER: vary: Accept-Encoding
HEADER: content-length: 193
HEADER: connection: close
HEADER: content-type: text/xml
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>服务器大人说 : 成都天气 很厚道!又要下雨了</string></value>
</param>
</params>
</methodResponse>
这个就是返回的内容了 描述返回了一个 string
 
server.php
 
require "lib/xmlrpc.inc.php";
require "lib/xmlrpcs.inc.php";
require "Logger.php";
//Logger::clean();
function saySomething($msg) {
        
$words=php_xmlrpc_decode($msg->getParam(0));//从msg对象中解码出参数1 为变量
 //你可以在这里干n多事情
 //下面返回结果
if(strlen($words)>0) {
     return new xmlrpcresp( new xmlrpcval('服务器大人说 : '.$words, 'string') );
 //返回给客户的
}
else
{
     return new xmlrpcresp(0,$xmlrpcerruser + 100, "参数 ‘".$words."’ 服务器怀疑你说废话.");
 //出现错误返回给客户的,当然也可以不返回
 //如果有什么参数不对啊 系统会返回错误的
 //$xmlrpcerruser + 100 这个是返回客户自定义错误时候的错误代码
 //开发RPC程序的时候最好自己定义一个错误表 客户端显示的错误编号会是 100 }
}
 
//最后建立服务器
 
$s=new xmlrpc_server(
    array(
     'say' => array(
       'function' => 'saySomething', //命令对应要调用的函数
       'signature' => array( array('string','string') ),//返回,输入 的数据类型
 //一个函数可以有几种输入和输出类型
       'docstring' => 'This service echoes Hello+input stirng.'
 //对该调用的说明
       )
       )
    ,0 //这个参数决定此时不立即服务
    );
//$s->response_charset_encoding = "UTF-8"; //可以设置一些参数
$s->service();//现在才开始服务
?>
 
client.php
 
<?
require('lib/xmlrpc.inc.php');
$s=new xmlrpc_client('/test/xmlrpc/server.php', 'localhost', 80);//建立连接器
//$client->request_charset_encoding = 'UTF-8';
if($_GET['debug'])$s->setDebug(2); //可以设置调试来查看详细HTTP 请求信息  
 
$input=new xmlrpcval(' 成都天气 很厚道!又要下雨了 ', 'string');//要传递的变量,用他的类进行包装 以便自动转化成有效的XML
$paras=array($input);//参数都要丢到数组中
$msg=new xmlrpcmsg('say', $paras);//命令 这些你发布服务器的时候要有文档描述的
$response=$s->send($msg);//用刚才建立的连接器发送这条请求

if($response->faultcode()==0) {

//执行没有异常
$response=php_xmlrpc_decode($response->value());
echo $response;//    显示结果
} else {
    print '错误: '.$response->faultcode().', '.$response->faultstring().'';

//发生错误
}

我的 版本是  

XML-RPC for PHP version 2.2

XML-RPC 里很多全局变量在与你自己的应用框架集成的时候 要注意点,这个包提供很多helper可以研究下。