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

PHP 獲取遠程文件大小:基於 HTTP Head 輕量級實現

     編輯:PHP 綜合知識

不下載文件獲取大小:發送 HEAD 請求解析 Content-Length

通過 fsockopen 建立 TCP 連接,發送 HTTP/1.1 HEAD 請求,僅獲取響應頭中的 Content-Length,避免下載整個文件,極適合大文件、批量鏈接檢測場景。

核心函數

<?php
function getFileSize($url) {
    $url = parse_url($url);
    $host = $url['host'];
    $port = $url['port'] ?? 80;
    $path = $url['path'] ?? '/';

    if (!$fp = @fsockopen($host, $port, $errno, $errstr, 10)) {
        return null; // 連接失敗
    }

    // 發送 HEAD 請求
    fputs($fp, "HEAD $path HTTP/1.1\r\n");
    fputs($fp, "Host: $host\r\n");
    fputs($fp, "Connection: Close\r\n\r\n");

    // 讀取響應頭
    while (!feof($fp)) {
        $line = fgets($fp);
        if (trim($line) === '') break; // 頭部結束
        if (preg_match('/Content-Length:\s*(\d+)/i', $line, $matches)) {
            fclose($fp);
            return (int)$matches[1]; // 返回字節數
        }
    }
    fclose($fp);
    return null; // 無 Content-Length (如分塊傳輸)
}

// 測試
echo getFileSize("https://www.jb51.net/images/logo.gif"); // 4445
?>

關鍵點解析

  1. 用 HEAD 而非 GET:服務器不返回 Body,節省帶寬與時間。
  2. HTTP/1.1 必須發送 Host 頭,否則虛擬主機環境下返回 400。
  3. Connection: Close:避免保持連接導致 feof() 阻塞。
  4. 超時控制:fsockopen 第 5 參數設置連接超時 (秒)。
  5. 分塊傳輸 (Transfer-Encoding: chunked):無 Content-Length,函數返回 null,需改用 GET 範圍請求或下載統計。
  6. HTTPS 支持:將 fsockopen 改為 stream_socket_client('ssl://host:443') 或用 cURL。

現代替代:cURL 一行搞定

function getFileSizeCurl($url) {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_NOBODY => true,      // HEAD 請求
        CURLOPT_HEADER => true,      // 包含頭
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true, // 跟隨重定向
        CURLOPT_TIMEOUT => 10,
        CURLOPT_SSL_VERIFYPEER => false, // 測試環境
    ]);
    curl_exec($ch);
    $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
    curl_close($ch);
    return $size > 0 ? (int)$size : null;
}

cURL 支持 HTTPS、重定向、代理、並發,生產環境首選。

應用場景

  • 下載鏈接預檢:顯示文件大小、預估下載時間。
  • 死鏈/空文件檢測:Content-Length: 0 或 404。
  • 批量資源審計:掃描 CDN/對象存儲桶內文件大小統計。

輕量、高效、不佔用磁盤 IO,是遠程文件大小獲取的標準姿勢。

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