gteric 发表于 2017-3-24 11:47:55

[转]用PHP写XMLRPC

  这几天一直在研究XMLRPC。最初的原因是因为del.icio.us支持每日的“书签自动发布到Blog”功能,而我的533上面有自己写PHP Blog程序,于是就自己联想到是否可以让del.icio.us自动发布到那个上面去。一方面可以保存自己的书签,另外还可以当没有时间写Blog的时候,可以偷懒一下。这样一举两得的时期,我是最愿意做的。
  del.icio.us主要利用metaWeblog API这个XMLRPC规范来实现Blog自动发布的,所以只有你的Blog程序支持这个接口,实际上只要支持metaWeblog.newPost这个函数就可以了。
  XMLRPC-PHP是一个PHP库,它的特点是功能强大,而且不需要PHP的原生XMLRPC支持,只需要PHP的XML库。XMLRPC-PHP对于XMLRPC的各种数据类型进行了封装,并且自动提供如ListMethod、GetMethodSig、GetMethodHelp等函数。
  简单的一个PHP函数,计算两个数的总和:
  //addFunc的Singature(签名),表明其返回类型是int(第一个参数),和参数类型(后面的参数);
  $addFunc_sig=array(array($xmlrpcInt,$xmlrpcInt,$xmlrpcInt));
  //addFunc的Doc(说明)
  $addFunc_doc='Calucate the sum of Tow Integer,return Integer";
  function AddFunc($m){
  $a=$m->getParam(0);//注意这里$a是signatue里面的第二个参数
  $b=$m->getParam(1);//这里的$b是第三个参数
  $a=$a->scalarValue(); //取得他们的具体数值。
  $b=$b->scalarValue();
  //下面这些返回一个xmlrpcresp对象,对象的内容包括一个int类型的val(变量)
  return new xmlrpcresp(new xmrpcval($a+$b,"int"));
  }
  //下面输出:
  $a=array(
  "example.addTow"=>array(
  "function" => "addFunc",
  "signature" => $addFunc_sig,
  "docstring" => $addFunc_doc
  )
  );
  //生成xmlrpc_server变量,第一个参数是方法的数组。false代表立刻进行服务。
  $s=new xmlrpc_server($a,false);
  $s->setDebug(3); //3为调试等级。3可以比较详细的输出错误信息。如果没有错误了,可以用确省的1就可以了,就是没有Debug信息。
  $s->service(); //开始服务。
  从上面来看,用XMLRPC-PHP库建立XMLRPC程序是非常的快速方便。
  下面几个是XMLRPC里面几个其他数据类型的返回和调用其数值:
  1、数组变量的查询和返回(摘自XMLRPC-PHP自带的例子demo/server.php)
  $bitflipper_sig=array(array($xmlrpcArray, $xmlrpcArray));
  $bitflipper_doc='Accepts an array of booleans, and returns them inverted';
  function bitflipper($m) {
  global $xmlrpcArray;
  $v=$m->getParam(0);
  $sz=$v->arraysize();
  $rv=new xmlrpcval(array(), $xmlrpcArray); //必须用xmlrpc方式来建立数组
  for($j=0; $j
  $b=$v->arraymem($j); //获取数组里面的Salar
  if ($b->scalarval()) { //查看数组元素的值
  $rv->addScalar(false, "boolean"); //向返回数组里面添加Salar
  } else {
  $rv->addScalar(true, "boolean");
  }
  }
  return new xmlrpcresp($rv); //返回数组。
  }
  2、Struct变量的查询和返回
  第一个变量的访问例子:
  $v1_easyStruct_sig=array(array($xmlrpcInt, $xmlrpcStruct));
  $v1_easyStruct_doc='This handler takes a single parameter, a struct, containing at least three elements named moe, larry and curly, all <i4>s. Your handler must add the three numbers and return the result.'; </i4>
  function v1_easyStruct($m) {
  $sno=$m->getParam(0);
  $moe=$sno->structmem("moe"); //存取Struct里面的数值
  $larry=$sno->structmem("larry");
  $curly=$sno->structmem("curly");
  $num=$moe->scalarval() + $larry->scalarval() + $curly->scalarval();
  return new xmlrpcresp(new xmlrpcval($num, "int")); }
  第二个返回Struct的例子:
  $v1_simpleStructReturn_sig=array(array($xmlrpcStruct, $xmlrpcInt)); $v1_simpleStructReturn_doc='This handler takes one parameter, and returns a struct containing three elements, times10, times100 and times1000, the result of multiplying the number by 10, 100 and 1000.';
  function v1_simpleStructReturn($m) {
  $sno=$m->getParam(0);
  $v=$sno->scalarval();
  return new xmlrpcresp(new xmlrpcval(array(
  "times10" => new xmlrpcval($v*10, "int"),
  "times100" => new xmlrpcval($v*100, "int"),
  "times1000" => new xmlrpcval($v*1000, "int")),
  "struct" )); //返回一个Struct.
  }
  看了这些,如果对于XMLRPC协议比较熟悉,发现XMLRPC-PHP对于XMLRPC的支持是非常的完善的!
  最后一点,同其他的远程调用的调试一样,XMLRPC的PHP程序的调试比较的麻烦。幸亏xmlrpc-php的主页上面提供了一个调试XMLRPC的好地方,你可以从这里访问。   
http://static.flickr.com/110/307477290_e548b7a55b.jpg?v=0
  最主要把"show debug info"显示调到“More”,这样可以非常容易的找到出错原因。
  另外一点,如果想测试一个东西,最好从最简单的东西开始,其实无论是HelloWorld还是addTwo都是一个非常好的起点,如果他们成功了,表示你的程序的基础设置是没有问题。如果和我一样,马上就写一个比较复杂的程序来测试一个新事物,如果测试不成功,到底是测试程序本身的错误还是基础设置的错误,就像一头乱麻一样,分不清楚头绪,找不到方向了。当然一个比较好的调试系统,可以非常清楚显示运行过程,就太好了。
  明天再写如何让我的PHP Blog程序能够接受Del.icio.us的发布,也写一下如何调用LiveSpace的MetaWeblog接口。
页: [1]
查看完整版本: [转]用PHP写XMLRPC