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