博客程序通過 Ping 服務在第一時間通知聚合站點內容更新。基於 XML-RPC 協議,標準方法包括 weblogUpdates.Ping 與 weblogUpdates.extendedPing。
<?php
$host = 'zxsv';
$port = 80;
$rpc_server = '/test/xmlrpc_server.php';
$title = 'zxsv';
$server = 'https://zxsv/test/';
$rss = 'https://zxsv/test/rss.php';
// 構建 XML-RPC 請求
$Ping = xmlrpc_encode_request('weblogUpdates.Ping', array($title, $server));
$extendedPing = xmlrpc_encode_request('weblogUpdates.extendedPing', array($title, $server, $rss));
// 發送請求並獲取響應
$response = rpc_client_call($host, $port, $rpc_server, $Ping);
// 解析響應(去除 HTTP 頭)
$split = '<?xml version="1.0" encoding="iso-8859-1"?>';
$xml = explode($split, $response);
$xml = $split . array_pop($xml);
$response = xmlrpc_decode($xml);
print_r($response);
/**
* XML-RPC 客戶端調用封裝
* @param string $host 目標主機
* @param int $port 端口
* @param string $rpc_server 服務端路徑
* @param string $request XML 請求體
* @return string|false 響應內容或 false
*/
function rpc_client_call($host, $port, $rpc_server, $request) {
$fp = fsockopen($host, $port);
if (!$fp) return false;
$query = "POST $rpc_server HTTP/1.0\r\n";
$query .= "User-Agent: XML-RPC Client\r\n";
$query .= "Host: $host\r\n";
$query .= "Content-Type: text/xml\r\n";
$query .= "Content-Length: " . strlen($request) . "\r\n\r\n";
$query .= $request . "\r\n";
if (!fputs($fp, $query, strlen($query))) {
fclose($fp);
return false;
}
$contents = '';
while (!feof($fp)) {
$contents .= fgets($fp);
}
fclose($fp);
return $contents;
}
?>
| 方法 | 參數 | 用途 |
|---|---|---|
weblogUpdates.Ping | (blogName, blogURL) | 基本更新通知 |
weblogUpdates.extendedPing | (blogName, blogURL, rssURL) | 包含 RSS 源地址的增強通知 |
確保 php.ini 載入 extension=xmlrpc.so (Linux) 或 extension=php_xmlrpc.dll (Windows)。