• trackback的原理与实现 trackback扫盲


    [ 2005-09-24 01:33 | 作者: coolsky ]
    字体: | |
    这是本人对Trackback的总结,相信你看完本文一定会对Trackback有很明确的理解了!

    [一]通俗的介绍
    Trackback大部分人刚接触到肯定会觉得很迷惑,不知道怎么用。其实它也没有那么神秘,以下介绍一下我对Trackback的理解。
    简单说trackback是一个点对点通信和网站间互相通告的框架。这句话也讲不明白.
    那就拿实例来说:
    A在他的博客A.com上写了一篇文章 支持Trackback 引用地址为:http://a.com/trackback.php?id=1
    B想写一篇文章回复A,惯用方法是我在A文章的下面写评论,但是Trackback带来了新的革命:B可以把文章写在自己的blog上,而同时又能在A的文章下面显示B这篇文章的部分内容。

    这就是利用了Trackback,那么A想要看别人评论的全文就要到B的网站上去,这样就带来了网站之间的互通,这才是Blog的精髓。虽然在国内大部分还习惯用comment的方式。
    Trackback与comment不同的地方在于,你可以更好的控制自己的文章,按规定当你在你网站修改文章的时候,A网站上的你的内容同步改动.甚至删除

    [二]trackback的使用方法
    也很简单,一般A发表的文章下面会有类似这样的引用地址:

    引用通告地址:
    GB2312 http://saysay.cn/trackback.php?id=86&encode=gb2312
    UTF-8 http://saysay.cn/trackback.php?id=86&encode=utf-8

    那么B在发表文章的时候有个地方填写trackback地址的,如果我想引用gb2312的那么把http://saysay.cn/trackback.php?id=86&encode=gb2312这个地址拷贝填写进去,然后发表日志,那么A网站将会出现你日志的内容。同样当你修改文章的时候,A网站上你的内容也会随着更改。

    [三]更深入研究,程序之间互通方式
    这个就是trackback的技术规范了 简单的说就是发送的时候假造了一个POST方式的HTTP Request 其中含有title/excerpt/url/blog_name 除url以为均为可选 而Content-Type信息为application/x-www-form-URLencoded charset信息是以上四部分所使用的编码. 最后形成类似这么一段HTTP请求发送出去:

    POST /cblog2/trackback.php?id=181&encode=gb2312 HTTP/1.1
    Host: 127.0.0.1
    Connection: close
    Content-Length: 165
    Content-Type: application/x-www-form-urlencoded; charset=iso-8859-1
    title=test%20trackback&url=http%3A%2F%2F127.0.0.1%2Fcblog2%2Findex.php%3Fid%3D183&excerpt=hello%2Cthis%20is%20a%

    20trackback%20test%21&blog_name=Coolsky%27%27s%20Blog
    [code]
    注意发送的内容必须经过URL编码后发送,否则中文就会显示错误
    对方服务器收到请求后,将会发送一段XML格式的应答 很简单 没错的话<error>字段是0 否则是1 并附带一段<message>来说明错误信

    息. 类似这样:
    成功的应答:
    [code]
    <?xml version="1.0″ encoding="utf-8″?>
    <response>
    <error>0</error>
    </response>

    失败的应答:

    <?xml version="1.0″ encoding="utf-8″?>
    <response>
    <error>1</error>
    <message>The error message</message>
    </response>


    同时发送成功的话,您发送的所有内容将会被对方记入数据库。如此就显示在对方网站上了

    [三]PHP中Trackback的具体实现
    1.发送Trackback
    当你发表文章的时候填写了trackback地址,提交以后,程序就会自动发送一个构造的POST方式的HTTP Request
    笔者以本站程序为例:
    我定义一个发送程序:

    function sendTrackback($host,$title,$url,$excerpt,$blog_name) {
    $buf="";
    $host = str_replace('http://', '', $host);
    $path = explode('/', $host);
    $host = $path[0];
    unset($path[0]);
    $path = '/' . implode('/', $path);
    $excerpt = cn_substr($excerpt,252);
    $fp = @fsockopen($host, 80, $errno, $errstr, 30);
    if(!$fp) {
    Return flase;
    }
    $blog_name=str_replace("'", "''", $blog_name);;
    $query = 'title=' . rawurlencode($title);
    $query .= '&url=' . rawurlencode($url);
    $query .= '&excerpt=' . rawurlencode($excerpt);
    $query .= '&blog_name=' . rawurlencode($blog_name);

    $out = 'POST ' . $path . ' HTTP/1.1' . "\r\n";
    $out .= 'Host: ' . $host . "\r\n";
    $out .= 'Connection: close' . "\r\n";
    $out .= 'Content-Length: ' . strlen($query) . "\r\n";
    $out .= 'Content-Type: application/x-www-form-urlencoded; charset=iso-8859-1' . "\r\n\r\n";
    $out .= $query . "\r\n";
    fwrite($fp, $out);
    while (!feof($fp))
    $buf .= fgets($fp,128);
    fclose($fp);
    $arr=explode("<error>",$buf);
    $return_num=intval(substr($arr[1], 1, 0));
    if($return_num==0){
    return true;
    }else{
    $arr2=explode("message",$buf);
    $return_msg=str_replace(">", "", $arr2[1]);
    $return_msg=str_replace("</", "", $return_msg);
    admin_info("日志添加成功<br>Trackback 发送失败,服务器返回信息:$return_msg","main.php?

    do=blogManager");
    }
    }

    函数介绍:
    本函数通过trackback的规范规定的5个参数,标题,主机,引用地址,我发表的内容,我的站点名称 函数首先通过字符串处理得到主机

    ip或域名,然后通过fsockopen()函数打开socket连接,这个函数的使用方法类似fopen()打开连接成功后,把处理完的模拟POST表单的

    HTTP REQUEST数据$out 发送给对方,通过fwrite()实现。
    发送完后我们用fgets()函数获得服务器返回值,然后存到$buf这个变量之中,然后对返回值进行处理,如果返回含有

    <error>0</error>则发送成功并接受成功,如果返回含有<error>1</error>则接受失败,我们取出服务器返回错误信息

    <message></message>之间的内容,并输出错误提示。(其中admin_info()是我自定义的输出错误信息的函数,你可以用简单的echo输

    出错误信息)

    2.接收Trackback
    我们用Trackback.php来实现接收。比发送更简单。
    因为我们基于XML通讯,所以首先在PHP文件开头加上
    header('Content-type: text/xml');
    然后用一般处理表单提交的方法获得POST过来的五个参数
    然后将这5个参数存入数据库,建立一个trackback表,包含五个参数的字段和自增ID就可以了,你还可以添加时间以记录
    如果存入成功,那么设置$error=0,如果失败则设置$error=1;
    并给出错误信息$msg='引用出现错误,可能数据库存在问题!';
    然后输出页面给发送方获得

    echo '<?xml version="1.0" encoding="gb2312"?>';
    if($error) {
    echo '<response><error>1</error><message>'.$msg.'</message></response>';
    } else {
    echo '<response><error>0</error></response>';
    }

    如此则完成Trackback全部发送接收过程!
    ps:如果要判断对方是修改文章,还是第一次提交trackback要求,只需要判断自己的trackback表中是否已经存在该url,如果不存在则

    insert 一条数据,如果已经存在则update这条数据
    如果想进一步了解,可以参考本人的程序代码!
  • 相关阅读:
    【转】C#操作Word的超详细总结
    【转】C#操作word定位光标
    详解Amazon S3上传/下载数据
    VS2010程序崩溃- APPCRASH
    环境搭建
    centos搭建svn服务器
    SpringMVC必备知识点汇总
    SpringSecurity 配置
    数据库汇总
    java.io.IOException 断开的管道 解决方法 ClientAbortException: java.io.IOException: Broken pipe
  • 原文地址:https://www.cnblogs.com/cxd4321/p/585688.html
Copyright © 2020-2023  润新知