百度 Ping 服務(https://ping.baidu.com/ping/RPC2)允許站長主動推送新增/更新頁面鏈接,加速收錄。本文提供基於 XML-RPC 協議的 PHP 類實現。
<?php
class Ping {
private $title; // 站點標題
private $hosturl; // 站點首頁
private $arturl; // 新文章鏈接
private $rssurl; // RSS 地址
private $baiduXML; // XML 請求體
private $baiduRPC = 'https://ping.baidu.com/ping/RPC2';
public function __construct($title, $arturl, $hosturl, $rssurl) {
if (empty($title) || empty($arturl)) return;
$this->title = $title;
$this->arturl = $arturl;
$this->hosturl = $hosturl;
$this->rssurl = $rssurl;
// 構建 weblogUpdates.extendedPing 請求
$this->baiduXML = '<?xml version="1.0" encoding="UTF-8"?>';
$this->baiduXML .= '<methodCall>';
$this->baiduXML .= '<methodName>weblogUpdates.extendedPing</methodName>';
$this->baiduXML .= '<params>';
$this->baiduXML .= '<param><value><string>' . $this->hosturl . '</string></value></param>';
$this->baiduXML .= '<param><value><string>' . $this->title . '</string></value></param>';
$this->baiduXML .= '<param><value><string>' . $this->arturl . '</string></value></param>';
$this->baiduXML .= '<param><value><string>' . $this->rssurl . '</string></value></param>';
$this->baiduXML .= '</params>';
$this->baiduXML .= '</methodCall>';
}
public function pingbaidu() {
$ch = curl_init();
$headers = [
'User-Agent: request',
'Host: ping.baidu.com',
'Content-Type: text/xml',
];
curl_setopt($ch, CURLOPT_URL, $this->baiduRPC);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->baiduXML);
$res = curl_exec($ch);
curl_close($ch);
// 返回結果中包含 0 表示成功
return (strpos($res, '<int>0</int>') !== false);
}
}
/* 輔助函數:獲取當前域名(含協議) */
function get_domain() {
$protocol = 'https://';
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') $protocol = 'https://';
$host = $_SERVER['HTTP_HOST'] ?? ($_SERVER['SERVER_NAME'] ?? '');
return $protocol . $host;
}
<?php
// 假設在文章發布/更新後調用
$title = '我的博客';
$arturl = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$hosturl = get_domain();
$rssurl = 'https://' . $_SERVER['HTTP_HOST'] . '/rss.xml';
$ping = new Ping($title, $arturl, $hosturl, $rssurl);
if ($ping->pingbaidu()) {
error_log('百度 Ping 成功: ' . $arturl);
} else {
error_log('百度 Ping 失敗: ' . $arturl);
}
weblogUpdates.extendedPing,參數順序固定:博客首頁、標題、文章鏈接、RSS 鏈接。<int>0</int> 代表成功,非零為錯誤碼。fastcgi_finish_request 後異步執行,不阻塞用戶響應。同理可構建 Google(已停用)、Bing、FeedBurner 等 Ping 請求,只需修改 RPC 端點與方法名。