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

織夢 CMS DedeHttpDown 類深度解析:HTTP 下載、重定向與內容獲取

     編輯:PHP 綜合知識

類概覽

DedeHttpDown 是織夢 CMS 內置的 HTTP 客戶端類,基於 fsockopen 實現,支持 GET/POST、自動處理 3xx 重定向、自定義 Header、文件下載、HTML 獲取等功能,無需依賴 cURL 擴展。

核心屬性

  • $m_host、$m_port、$m_path、$m_query:解析後的 URL 組件
  • $m_fp:Socket 文件指針
  • $m_httphead:響應頭數組(含狀態碼、Content-Type 等)
  • $m_puthead:發送的請求頭
  • $JumpCount:重定向計數器(防止無限循環,默認最多 3 次)

關鍵方法詳解

1. OpenUrl($url, $requestType="GET") — 入口方法

  • 初始化狀態,調用 PrivateInit() 解析 URL
  • 調用 PrivateStartSession() 建立連接、發送請求、接收響應頭
  • 自動處理 3xx 重定向(調用 JumpOpenUrl())

2. PrivateStartSession() — 核心協議交互

// 簡化流程
1. PrivateOpenHost() -> fsockopen($host, $port)
2. 構造請求行 + Host + 自定義 Header + User-Agent + Referer
3. HTTP/1.1 發送 "Connection: Close" 確保 feof 生效
4. 讀取狀態行 -> 解析 HTTP 版本、狀態碼、描述
5. 循環讀取響應頭 -> 填充 $m_httphead
6. 若連接異常關閉 -> 重試(最多 10 次)
7. 若 3xx 重定向 -> 解析 Location -> 遞歸 JumpOpenUrl()

3. 內容獲取方法

方法用途前置檢查
GetHtml()獲取網頁文本內容IsText() 必須通過(2xx + text/* 或 xml)
SaveToBin($file)下載二進制文件(圖片、壓縮包等)IsGetOK() 必須通過(2xx)
SaveToText($file)保存文本文件IsText() 通過

4. 輔助方法

  • GetHead($name):獲取響應頭(不區分大小寫)
  • SetHead($key, $val):設置自定義請求頭
  • FillUrl($relative):補全相對 URL 為絕對 URL
  • printError():輸出錯誤信息與完整響應頭,便於調試

實戰示例

下載圖片到本地

$down = new DedeHttpDown();
$down->OpenUrl('https://example.com/logo.png');
if ($down->IsGetOK()) {
    $down->SaveToBin('/data/images/logo.png');
    echo "下載成功,大小: " . filesize('/data/images/logo.png');
} else {
    $down->printError();
}

抓取網頁並自定義 Header

$down = new DedeHttpDown();
$down->SetHead('Accept-Language', 'zh-CN,zh;q=0.9');
$down->SetHead('Cookie', 'session=abc123');
$down->OpenUrl('https://api.example.com/user/profile');
if ($down->IsText()) {
    $html = $down->GetHtml();
    // 解析 $html ...
}

POST 提交表單

$down = new DedeHttpDown();
$down->OpenUrl('https://api.example.com/login?username=test&password=123', 'POST');
// 內部會將 URL 中 ? 後部分作為 POST body 發送
if ($down->IsGetOK()) {
    echo $down->GetHtml();
}

優缺點與現代替代方案

優點缺點建議替代
零依賴(僅需 sockets 擴展)代碼老舊,無命名空間、類型提示GuzzleHttp / Symfony HttpClient
自動處理重定向、Chunked 編碼無異步、並發、超時精細控制cURL 多句柄 / Swoole 協程
織夢二次開發無需額外安裝SSL/TLS 支持依賴 PHP 版本與流上下文確保 PHP 5.6+ 並配置 ca-certificates

遷移建議

新項目建議直接使用 Guzzle 7+:

$client = new \GuzzleHttp\Client(['timeout' => 10]);
$resp = $client->get('https://example.com', ['headers' => ['User-Agent' => 'MyBot']]);
echo $resp->getBody();

若維護老織夢項目,DedeHttpDown 仍可滿足基本需求,注意設置 set_time_limit(0) 防止大文件下載超時。

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