Beta 阶段进度报告 1——trackback 完成

转载

昨天搞定了 trackback,不过虚拟主机却挂了,无法更新。

这事说起来比较丢人,本来想实现 [url=http://www.sixapart.com/pronet/docs/trackback_spec]TrackBack Ping[/url],结果一直看的是 [url=http://developers.technorati.com/wiki/pingConfigurations]weblogUpdates.ping 的文档[/url],当然发不通……早说就是 post 四个变量我何必费这劲,一直拖到今天……向自己机器上的 [url=http://www.sixapart.com/movabletype/]Movable Type[/url] 和 [url=http://www.blogbus.com/]blogbus[/url] 上的测试帐号发送成功,又自己对自己发送,也接收成功,应该算是通过了吧。spam 应该暂时还轮不到我头上,碰到再说,关键点是 MySQL 用 [url=http://dev.mysql.com/doc/mysql/en/memory-storage-engine.html]heap[/url] 类型的表来记录应该能提升不少效率。

POST 方式要用 socket,算是 PHP FAQ 吧,希望这个函数有能用上的。

[phpcode]
// 用 socket 方式发送 trackback

function trackback($sURL, $aData) {

/*

使用方法
$aTrackbackData = array(
"title" => "test",
"excerpt" => "test",
"url" => "test",
"blog_name" => "test"
);
trackback("http://tb.test.com/tb.cgi?id=1", $aTrackbackData);

*/

// 要提交的变量

$sData = "";
foreach ($aData as $key => $value) {
if(!empty($sData)) {
$sData .= "&";
}
$sData .= rawurlencode($key)."=".rawurlencode($value);
}
$sData = trim($sData);

// 将 url 分解成 socket 连接所需要的

$aURL = parse_url($sURL);

$aURL["port"] = empty($aURL["port"]) ? 80 : $aURL["port"];

// socket 连接

$fp = fsockopen($aURL["host"], $aURL["port"], $errno, $errstr, 10);
if ($fp) {

$aURL["query"] = isset($aURL["query"]) ? "?".$aURL["query"] : "";

fputs($fp, "POST ".$aURL["path"].$aURL["query"]." HTTP/1.0\r\n");
fputs($fp, "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n");
fputs($fp, "Host: ".$aURL["host"]."\r\n");
fputs($fp, "Content-length: ".strlen($sData)."\r\n");
fputs($fp, "\r\n".$sData);
fputs($fp, "\r\n");

// 取返回值
$sReturn = "";
while(!feof($fp)){
$sReturn .= fgets($fp);
}

fclose ($fp);
}
return $sReturn;
}
[/phpcode]

完成的意义是,最起码我可以放心的说我这东西叫 blog 了

[hr]

[b]Update in 2005-08-07 21:02[/b]

发现还有 BUG,改正之:

1.不应该发送 \n,而应该是 \r\n,发现 Apache 兼容后者,而 IIS 不兼容前者,又是一个该死的事实标准
2.增加一个“fputs($fp, "Host: ".$aURL["host"]."\r\n");”,不然 name-based 虚拟主机可能会无法接收

主要是对 donews.net 发发不出去而发现的,以后发现别的问题再说