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

PHP斷點續傳與分塊下載類實現指南

     編輯:PHP 綜合知識

概述

本文介紹一個功能完善的 PHP 下載類,支援斷點續傳、分塊下載、自動處理重定向與錯誤恢復。適用於大文件下載場景,透過 Socket 直接控制 HTTP 協議,避免記憶體溢出。

核心功能

  • 支援 HTTP/1.0 Range 請求實現斷點續傳
  • 自動解析 Content-Length 與重定向 Location
  • 本地暫存檔記錄下載進度,支援中斷後恢復
  • 可配置下載速度限制、超時時間、自定義 Header
  • 完善的異常處理與資源釋放機制

類結構說明

class downloader {
    // 靜態入口方法
    static function get($url, $save_file, $speed = 10240, $headers = [], $timeout = 10)
    
    // 內部輔助方法
    static function parse_url($url)
    static function get_content_size($host, $port, $url_path, &$headers, $timeout)
    static function download_content($host, $port, $url_path, $save_file, $content_length, $range_start, $speed, &$headers, $timeout)
    static function build_header($action, $url_path, &$headers, $range_start = -1)
}

關鍵邏輯解析

1. URL 解析與預設 Header

parse_url() 拆解協議、主機、埠、路徑與查詢字串。預設 Header 模擬瀏覽器行為,包含 Accept、User-Agent、Accept-Encoding、Host、Connection、Accept-Language。

2. 獲取文件大小與斷點檢查

發送 HEAD 請求獲取 Content-Length,若遇 3xx 重定向遞迴跟進。本地若已存在 .data 暫存檔,讀取上次下載位移;若文件大小不匹配或超出遠端大小,重置進度。

3. 分塊下載核心

download_content() 組裝帶 Range: bytes={$range_start}- 的 GET 請求,透過 fsockopen 建立連線,逐塊讀取(預設 10KB)寫入檔案,並即時更新總位移。下載完成刪除暫存檔,異常時拋出異常保留進度。

使用範例

try {
    if (downloader::get('https://example.com/large.zip', 'large.zip')) {
        echo '下載成功';
    }
} catch (Exception $e) {
    echo '下載失敗: ' . $e->getMessage();
}

注意事項

  • 需確保 PHP 環境允許 fsockopen 與 stream_set_timeout
  • 遠端伺服器必須支援 Accept-Ranges: bytes
  • 大文件建議調大 set_time_limit 或分段下載
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved