trackback的原理與實(shí)現(xiàn) trackback掃盲
[ 2005-09-24 01:33 | 作者: coolsky ]
這是本人對Trackback的總結(jié),相信你看完本文一定會對Trackback有很明確的理解了!
[一]通俗的介紹 Trackback大部分人剛接觸到肯定會覺得很迷惑,不知道怎么用。其實(shí)它也沒有那么神秘,以下介紹一下我對Trackback的理解。 簡單說trackback是一個(gè)點(diǎn)對點(diǎn)通信和網(wǎng)站間互相通告的框架。這句話也講不明白. 那就拿實(shí)例來說: A在他的博客A.com上寫了一篇文章 支持Trackback 引用地址為:http:///trackback.php?id=1
B想寫一篇文章回復(fù)A,慣用方法是我在A文章的下面寫評論,但是Trackback帶來了新的革命:B可以把文章寫在自己的blog上,而同時(shí)又能在A的文章下面顯示B這篇文章的部分內(nèi)容。 這就是利用了Trackback,那么A想要看別人評論的全文就要到B的網(wǎng)站上去,這樣就帶來了網(wǎng)站之間的互通,這才是Blog的精髓。雖然在國內(nèi)大部分還習(xí)慣用comment的方式。 Trackback與comment不同的地方在于,你可以更好的控制自己的文章,按規(guī)定當(dāng)你在你網(wǎng)站修改文章的時(shí)候,A網(wǎng)站上的你的內(nèi)容同步改動.甚至刪除 [二]trackback的使用方法 也很簡單,一般A發(fā)表的文章下面會有類似這樣的引用地址: 引用通告地址: GB2312 http:///trackback.php?id=86&encode=gb2312 UTF-8 http:///trackback.php?id=86&encode=utf-8 那么B在發(fā)表文章的時(shí)候有個(gè)地方填寫trackback地址的,如果我想引用gb2312的那么把http:///trackback.php?id=86&encode=gb2312這個(gè)地址拷貝填寫進(jìn)去,然后發(fā)表日志,那么A網(wǎng)站將會出現(xiàn)你日志的內(nèi)容。同樣當(dāng)你修改文章的時(shí)候,A網(wǎng)站上你的內(nèi)容也會隨著更改。 [三]更深入研究,程序之間互通方式 這個(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請求發(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ā)送,否則中文就會顯示錯(cuò)誤 對方服務(wù)器收到請求后,將會發(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)容將會被對方記入數(shù)據(jù)庫。如此就顯示在對方網(wǎng)站上了 [三]PHP中Trackback的具體實(shí)現(xiàn) 1.發(fā)送Trackback 當(dāng)你發(fā)表文章的時(shí)候填寫了trackback地址,提交以后,程序就會自動發(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ā)送給對方,通過fwrite()實(shí)現(xiàn)。 發(fā)送完后我們用fgets()函數(shù)獲得服務(wù)器返回值,然后存到$buf這個(gè)變量之中,然后對返回值進(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:如果要判斷對方是修改文章,還是第一次提交trackback要求,只需要判斷自己的trackback表中是否已經(jīng)存在該url,如果不存在則 insert 一條數(shù)據(jù),如果已經(jīng)存在則update這條數(shù)據(jù) 如果想進(jìn)一步了解,可以參考本人的程序代碼! |
|