這是本人對Trackback的總結,相信你看完本文一定會(huì )對Trackback有很明確的理解了!
[一]通俗的介紹 Trackback大部分人剛接觸到肯定會(huì )覺(jué)得很迷惑,不知道怎么用。其實(shí)它也沒(méi)有那么神秘,以下介紹一下我對Trackback的理解。
簡(jiǎn)單說(shuō)trackback是一個(gè)點(diǎn)對點(diǎn)通信和網(wǎng)站間互相通告的框架。這句話(huà)也講不明白.
那就拿實(shí)例來(lái)說(shuō):
A在他的博客A.com上寫(xiě)了一篇文章 支持Trackback 引用地址為:http://a.com/trackback.php?id=1
B想寫(xiě)一篇文章回復A,慣用方法是我在A(yíng)文章的下面寫(xiě)評論,但是Trackback帶來(lái)了新的革命:B可以把文章寫(xiě)在自己的blog上,而同時(shí)又能在A(yíng)的文章下面顯示B這篇文章的部分內容。
這就是利用了Trackback,那么A想要看別人評論的全文就要到B的網(wǎng)站上去,這樣就帶來(lái)了網(wǎng)站之間的互通,這才是Blog的精髓。雖然在國內大部分還習慣用comment的方式。
Trackback與comment不同的地方在于,你可以更好的控制自己的文章,按規定當你在你網(wǎng)站修改文章的時(shí)候,A網(wǎng)站上的你的內容同步改動(dòng).甚至刪除 [二]trackback的使用方法 也很簡(jiǎn)單,一般A發(fā)表的文章下面會(huì )有類(lèi)似這樣的引用地址:
引用通告地址:
GB2312 http://saysay.cn/trackback.php?id=86&encode=gb2312
UTF-8 http://saysay.cn/trackback.php?id=86&encode=utf-8
那么B在發(fā)表文章的時(shí)候有個(gè)地方填寫(xiě)trackback地址的,如果我想引用gb2312的那么把http://saysay.cn/trackback.php?id=86&encode=gb2312這個(gè)地址拷貝填寫(xiě)進(jìn)去,然后發(fā)表日志,那么A網(wǎng)站將會(huì )出現你日志的內容。同樣當你修改文章的時(shí)候,A網(wǎng)站上你的內容也會(huì )隨著(zhù)更改。
[三]更深入研究,程序之間互通方式 這個(gè)就是trackback的技術(shù)規范了 簡(jiǎn)單的說(shuō)就是發(fā)送的時(shí)候假造了一個(gè)POST方式的HTTP Request 其中含有title/excerpt/url/blog_name 除url以為均為可選 而Content-Type信息為application/x-www-form-URLencoded charset信息是以上四部分所使用的編碼. 最后形成類(lèi)似這么一段HTTP請求發(fā)送出去:
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]
注意發(fā)送的內容必須經(jīng)過(guò)URL編碼后發(fā)送,否則中文就會(huì )顯示錯誤
對方服務(wù)器收到請求后,將會(huì )發(fā)送一段XML格式的應答 很簡(jiǎn)單 沒(méi)錯的話(huà)<error>字段是0 否則是1 并附帶一段<message>來(lái)說(shuō)明錯誤信
息. 類(lèi)似這樣:
成功的應答:
[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>
同時(shí)發(fā)送成功的話(huà),您發(fā)送的所有內容將會(huì )被對方記入數據庫。如此就顯示在對方網(wǎng)站上了
[三]PHP中Trackback的具體實(shí)現 1.發(fā)送Trackback 當你發(fā)表文章的時(shí)候填寫(xiě)了trackback地址,提交以后,程序就會(huì )自動(dòng)發(fā)送一個(gè)構造的POST方式的HTTP Request
筆者以本站程序為例:
我定義一個(gè)發(fā)送程序:
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 發(fā)送失敗,服務(wù)器返回信息:$return_msg","main.php?
do=blogManager");
}
}
函數介紹:
本函數通過(guò)trackback的規范規定的5個(gè)參數,標題,主機,引用地址,我發(fā)表的內容,我的站點(diǎn)名稱(chēng) 函數首先通過(guò)字符串處理得到主機
ip或域名,然后通過(guò)fsockopen()函數打開(kāi)socket連接,這個(gè)函數的使用方法類(lèi)似fopen()打開(kāi)連接成功后,把處理完的模擬POST表單的
HTTP REQUEST數據$out 發(fā)送給對方,通過(guò)fwrite()實(shí)現。
發(fā)送完后我們用fgets()函數獲得服務(wù)器返回值,然后存到$buf這個(gè)變量之中,然后對返回值進(jìn)行處理,如果返回含有
<error>0</error>則發(fā)送成功并接受成功,如果返回含有<error>1</error>則接受失敗,我們取出服務(wù)器返回錯誤信息
<message></message>之間的內容,并輸出錯誤提示。(其中admin_info()是我自定義的輸出錯誤信息的函數,你可以用簡(jiǎn)單的echo輸
出錯誤信息)
2.接收Trackback 我們用Trackback.php來(lái)實(shí)現接收。比發(fā)送更簡(jiǎn)單。
因為我們基于XML通訊,所以首先在PHP文件開(kāi)頭加上
header(‘Content-type: text/xml‘);
然后用一般處理表單提交的方法獲得POST過(guò)來(lái)的五個(gè)參數
然后將這5個(gè)參數存入數據庫,建立一個(gè)trackback表,包含五個(gè)參數的字段和自增ID就可以了,你還可以添加時(shí)間以記錄
如果存入成功,那么設置$error=0,如果失敗則設置$error=1;
并給出錯誤信息$msg=‘引用出現錯誤,可能數據庫存在問(wèn)題!‘;
然后輸出頁(yè)面給發(fā)送方獲得
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全部發(fā)送接收過(guò)程!
ps:如果要判斷對方是修改文章,還是第一次提交trackback要求,只需要判斷自己的trackback表中是否已經(jīng)存在該url,如果不存在則
insert 一條數據,如果已經(jīng)存在則update這條數據
如果想進(jìn)一步了解,可以參考本人的程序代碼!