首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

百度 Ping 服務 PHP 實現代碼示例

     編輯:PHP 相關知識

功能說明

百度 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);
}

關鍵點

  • XML-RPC 協議:請求體為標準 XML,方法名 weblogUpdates.extendedPing,參數順序固定:博客首頁、標題、文章鏈接、RSS 鏈接。
  • 返回值判斷:響應 XML 中 <int>0</int> 代表成功,非零為錯誤碼。
  • 防重複提交:建議記錄已 Ping 的 URL(如 Redis Set),避免重複提交被判為垃圾。
  • 異步執行:Ping 請求可能耗時 1-3 秒,建議放入消息隊列或 fastcgi_finish_request 後異步執行,不阻塞用戶響應。

擴展:支持多 Ping 服務

同理可構建 Google(已停用)、Bing、FeedBurner 等 Ping 請求,只需修改 RPC 端點與方法名。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved