设为首页 收藏本站
查看: 1071|回复: 0

[经验分享] php5中XML-RPC函数的使用

[复制链接]

尚未签到

发表于 2015-11-17 11:25:42 | 显示全部楼层 |阅读模式
  这几天在看了zend php5 code contest的比赛获奖作品,看了几个的关于web架构方面的获奖作品,感受颇深,xml和php结合应用越来多了,里面几乎所有的作品在设计上都用到了xml这个东西.....-_-! 又落伍了不少. 建议朋友们都去看看. 所以自己这几天在疯狂的学习php和xml结合的相关知识.
这其中就遇到了XML-RPC服务, 在网上可以找到的资料不多, 而且大多数都是用了其他第三方用php开发的XML-RPC class, 而用php5自带的xmlrpc函数(目前是试验模块)的好像就不多了, 但是个人还是比较喜欢原生的东西,就自己研究了一下.
  在手册中有人提供了一个例子,但是不支持中文, 并且没有告诉在客户端返回结果后怎么处理这个结果. 自己苦搞半天终于搞明白了,其实可以很轻松让他支持中文, 并且几乎不需要做任何额外的工作.
  下面是他原来的例子(可以在手册中找到):
/* clienttest.php */
<?php
function do_call($host, $port, $request) {
   
   $fp = fsockopen($host, $port, $errno, $errstr);
   $query = "POST /servertest.php HTTP/1.0/nUser_Agent: My Egg Client/nHost: ".$host."/nContent-Type: text/xml/nContent-Length: ".strlen($request)."/n/n".$request."/n";
     if (!fputs($fp, $query, strlen($query))) {
       $errstr = "Write error";
       return 0;
   }
     $contents = '';
   while (!feof($fp)) {
       $contents .= fgets($fp);
   }
     fclose($fp);
   return $contents;
}
  $host = 'localhost';
$port = 80;
$request = xmlrpc_encode_request('cycle', 'egg');
$response = do_call($host, $port, $request);
/* do something with $response, e.g. print it */
?>
  /* servertest.php */
<?php
function lifecycle($method, $params) {
/* $method = 'cycle', $params = (array of) request parameter(s); $data is also passed from xmlrpc_server_call_method, if we had any data to pass */
   switch($params[0]) {
       case 'egg':
           $reply = 'All eggs will be birds one day.';
       break;
       default:
           $reply = 'That must have been an otheregg';
   }
   return $reply;
}
  $server = xmlrpc_server_create();
  /* register the 'external' name and then the 'internal' name */
xmlrpc_server_register_method($server, "cycle", "lifecycle");
  $request = $HTTP_RAW_POST_DATA; // no you don't need 'always on', and no $_POST doesn't work.
  /* the parameters here are 'server, xml-string and user data'.  There's supposed to be an optional 'output options' array too, but I can't get it working :( hence header() call */
$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');
print $response;
  xmlrpc_server_destroy($server);
?>
  
这个例子中客户端得到$response后没有作任何的处理,这个返回值是这个样子的字符串:
HTTP/1.1 200 OK
Date: Thu, 04 Nov 2004 08:21:43 GMT
Server: Apache/2.0.47 (Win32) PHP/5.0.1
X-Powered-By: PHP/5.0.1
Connection: close
Content-Type: text/xml;charset=GB2312
  <?xml version="1.0" encoding="iso-8859-1"?>
<methodResponse>
<params>
<param>
  <value>
   <string>All eggs will be birds one day.</string>
  </value>
</param>
</params>
</methodResponse>
  这个字符串包含了两个部分,一个是html的头信息,一个是xml-rpc包文件,对他稍微进行一下处理就可以满足我们的要求了.
  
  下面看看我修改过的例子,主要用了一个xmlrpc_decode函数,网上没有找到说明,自己试了半天,才试出来他的用法:
/* clienttest.php */
<?php
function do_call($host, $port, $request) {
     $fp = fsockopen($host, $port, $errno, $errstr);
   $query = "POST /servertest.php HTTP/1.0/nUser_Agent: My Egg Client/nHost: ".$host."/nContent-Type: text/xml/nContent-Length: ".strlen($request)."/n/n".$request."/n";
     if (!fputs($fp, $query, strlen($query))) {
       $errstr = "Write error";
       return 0;
   }
     $contents = '';
   while (!feof($fp)) {
       $contents .= fgets($fp);
   }
     fclose($fp);
   return $contents;
}
  $host = 'localhost';
$port = 80;
$request = xmlrpc_encode_request('cycle', 'egg');
$response = do_call($host, $port, $request);
/* do something with $response, e.g. print it */
  $pos = strpos($response,  '<?xml');
$str = substr($response, $pos);
$tmp = xmlrpc_decode($str);
print_r($tmp);
  /* do something with $tmp e.g. print it */
?>

  /* servertest.php */
<?php
function lifecycle($method, $params) {
/* $method = 'cycle', $params = (array of) request parameter(s); $data is also passed from xmlrpc_server_call_method, if we had any data to pass */
   switch($params[0]) {
       case 'egg':
           $reply[] = 'All eggs will be birds one day.我市好人';
           $reply[] = 'All eggs will be birds one day.我市好人aaaaa';
       break;
       default:
           $reply[] = 'That must have been an otheregg我市好人';
   }
   return $reply;
}
  $server = xmlrpc_server_create();
  /* register the 'external' name and then the 'internal' name */
xmlrpc_server_register_method($server, "cycle", "lifecycle");
  $request = $HTTP_RAW_POST_DATA; // no you don't need 'always on', and no $_POST doesn't work.
  /* the parameters here are 'server, xml-string and user data'.  There's supposed to be an optional 'output options' array too, but I can't get it working :( hence header() call */
$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');
print ($response);
  xmlrpc_server_destroy($server);
?>
  运行一下,看看显示的数组的样式,这样处理起来就舒服多了.
  明白了这个,别闲着,看看php5自带的"SOAP Functions",使用方法和工作原理,大同小异啊.

  /***************************
* author : 大龄青年
* email : wenadmin@sina.com
* from: http://blog.iyunv.com/hahawen
***************************/
             版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-140267-1-1.html 上篇帖子: [配置]centos5.3下配置php开发环境 下篇帖子: apache2.4+php5+mysql配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表