本文介绍基于XML-RPC的PING更新通知实例代码,也是天缘博客正在使用的,没有完全按照XML-RPC标准那样完善设计,毕竟是个人博客,还是按需设计简单点,以后有时间再慢慢完善,如果大家需要自己写网站或论坛系统时,可能会用到,欢迎随时CTRL+C/CTRL+V。

一、XML-RPC客户端请求和服务器端响应

XML-RPC客户端请求

PING更新服务要求XML-RPC客户端请求元素有三个:

1、RPC端点,也就是大家常见的RPC地址,比如 http://blogsearch.google.com/ping/RPC2

2、调用方法,Google和Baidu都支持weblogUpdates.extendedPing,Feedsky似乎只支持 weblogUpdates.ping

3、参数部分,Google和百度都约定,必须顺序包含: 网站名、网站地址、更新文章地址、网站RSS地址或ATOM种子等在<param><value>xxx</param></value>字段中。

XML-RPC服务器端响应

XML-RPC响应中一般都只有两个元素,分别是响应状态标志和提示信息两部分,也有是乱七八糟的返回值的,这个要看人品了,比如GOOGLE会跟你说声thanks,Baidu则只会仍个0给你,下面看一下PHP实例。

二、PHP编程PING更新通知实例

1、发送和接收数据包

//发送和接收数据包
function fnSendPacket($hosturl,$data)
{
    $uinfo = parse_url($hosturl);
    if($uinfo[‘query’])
    {
        $data .= “&”.$uinfo[‘query’];
    }
    if(!$fsp = @fsockopen($uinfo[‘host’], (($uinfo[‘port’]) ? $uinfo[‘port’] : “80”), $errno, $errstr, 3))
    {
        return false;
    }
    fputs ($fsp, “POST “.$uinfo[‘path’].” HTTP/1.0rn”);
    fputs ($fsp, “Host: “.$uinfo[‘host’].”rn”);
    fputs ($fsp, “Content-type: text/xmlrn”);
    //fputs ($fsp, “Content-type: application/x-www-form-urlencodedrn”);
    fputs ($fsp, “Content-length: “.strlen($data).”rn”);
    fputs ($fsp, “Connection: closernrn”);
    fputs ($fsp, $data);
    $http_response = ”;
    while(!feof($fsp))
    {
        $http_response .= fgets($fsp, 128);
    }
    @fclose($fsp);
    list($resp_headers, $resp_content) = explode(“rnrn”, $http_response);//劈开头和内容   
    return $resp_content;
}

2、调用程序

$pingHostArr=array(‘http://www.feedsky.com/api/RPC2′,’http://ping.baidu.com/ping/RPC2′,’http://blogsearch.google.com/ping/RPC2’);
$methodArr=array(‘weblogUpdates.ping’,’weblogUpdates.extendedPing’);
$htmlurl=’http://www.metsky.com/archives/1.html’;//这里是实际的更新通知网址,实际使用动态创建
       
        $hnum = count($pingHostArr);
        for($i=0; $i<$hnum; $i++)
        {
            $data = ‘<?xml version=”1.0″?><methodCall><methodName>weblogUpdates.extendedPing</methodName><params><param><value>天缘博客</value></param><param><value>http://www.metsky.com</value></param><param><value>’.$htmlurl.'</value></param><param><value>http://www.metsky.com/rss.xml</value></param></params></methodCall>’;
            $res = fnSendPacket($pingHostArr[$i],$data);
            echo ‘<pre>’;
            print_r($res);
            if(strpos($res, “<int>0</int>”)||strpos($res, “<boolean>0</boolean>”)||strpos($res, “<string></string>”))//这里就是返回信息,各家网站约定有所差别,天缘直接判断字符了,不规范。
                echo “PING:”.$pingHostArr[$i].”成功<br/>”;
            else
                echo “PING:”.$pingHostArr[$i].”失败<br/>”;
        }

程序中的调用方法很重要,Google和Baidu都是采用weblogUpdates.extendedPing调用方法,Feedsky似乎只支持weblogUpdates.ping调用方法。

百度的XML-RPC请求元素,似乎官方的帮助页面是还要嵌套一级<string></string>,稍后再测试一下是否必须的。另外实际测试PING结果,要根据各家返回OK的约定值,比如文中百度的0值、Google的boolean 0、thanks等等。

3、FeedSky、Google和Baidu三家的PING特点

Google PING服务应用编程接口说明:http://www.google.com/intl/zh-CN/help/blogsearch/pinging_API.html

Baidu PING服务应用编程接口说明:http://www.baidu.com/search/blogsearch_help.html

FeedSky PING服务编程接口每看到在哪里,不过可以采用测试方式猜测返回值,并结合Feedsky后台来看效果。

整体来讲Google PING服务的容错性最好,Baidu次之,Feedsky再再次之,实际上PING更新通知本来就很简单,也不是什么重要的服务,只要通知到当前更新网页和RSS地址就可以了,没有必要约定的太死。而实际上确不是,要想向一个新的RPC地址PING更新,似乎非得尝试几种方法才能OK。