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 次)PrivateInit() 解析 URLPrivateStartSession() 建立連接、發送請求、接收響應頭JumpOpenUrl())// 簡化流程 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()
| 方法 | 用途 | 前置檢查 |
|---|---|---|
| GetHtml() | 獲取網頁文本內容 | IsText() 必須通過(2xx + text/* 或 xml) |
| SaveToBin($file) | 下載二進制文件(圖片、壓縮包等) | IsGetOK() 必須通過(2xx) |
| SaveToText($file) | 保存文本文件 | IsText() 通過 |
GetHead($name):獲取響應頭(不區分大小寫)SetHead($key, $val):設置自定義請求頭FillUrl($relative):補全相對 URL 為絕對 URLprintError():輸出錯誤信息與完整響應頭,便於調試$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();
}
$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 ...
}
$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) 防止大文件下載超時。