Keep on going, never give up.

基于XML-RPC的PING更新通知PHP编程实例

由于更换博客系统,这两天细节问题也是成堆出现,还好这几天是刚过年,有足够时间处理,相信过些日子会好一些,本文介绍基于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。

更多文章:

PHP常用正则表达式收集整理

PHP字符串正则替换及剖分函数比较

WordPress和Z-Blog各自特点及选择建议

相关评论(0):  

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

订阅博客

最新文章

本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载也必须遵循“署名-非商业用途-保持一致”的创作共用协议. 返回顶部
Copyright@2005-2016 Metsky.com, All rights Reserved.