PHP獲取本地文件、遠程文件的大小

jopen 9年前發布 | 46K 次閱讀 PHP PHP開發

  php中獲取文件大小時要考慮兩種情況:本地文件、遠程文件,下面總結一下開發過程中使用的處理方法。

一、獲取本地文件的大小

    直接使用filesize() 函數,可以返回指定文件的大小。

    若成功,則返回文件大小的字節數。若失敗,則返回 false 并生成一條 E_WARNING 級的錯誤。

二、獲取遠程文件的大小

    遠程文件的大小需要打開遠程的文件流,處理的方式有四種:

    1,get_headers

        get_headers($url,true);  返回結果如圖所示:

                     PHP獲取本地文件、遠程文件的大小

    2,file_get_contents

$file = file_get_content($url);
echo strlen($file)/1024;

    3,curl方式

function remote_filesize($uri,$user='',$pw='')  
{  
    // start output buffering  
    ob_start();  
    // initialize curl with given uri  
    $ch = curl_init($uri);  
    // make sure we get the header  
    curl_setopt($ch, CURLOPT_HEADER, 1);  
    // make it a http HEAD request  
    curl_setopt($ch, CURLOPT_NOBODY, 1);  
    // if auth is needed, do it here  
    if (!emptyempty($user) && !emptyempty($pw))  
    {  
        $headers = array('Authorization: Basic ' . base64_encode($user.':'.$pw));  
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);  
    }  
    $okay = curl_exec($ch);  
    curl_close($ch);  
    // get the output buffer  
    $head = ob_get_contents();  
    // clean the output buffer and return to previous  
    // buffer settings  
    ob_end_clean();  
  
    echo '<br>head-->'.$head.'<----end <br>';  
  
    // gets you the numeric value from the Content-Length  
    // field in the http header  
    $regex = '/Content-Length:\s([0-9].+?)\s/';  
    $count = preg_match($regex, $head, $matches);  
  
    // if there was a Content-Length field, its value  
    // will now be in $matches[1]  
    if (isset($matches[1]))  
    {  
        $size = $matches[1];  
    }  
    else  
    {  
        $size = 'unknown';  
    }  
    //$last=round($size/(1024*1024),3);  
    //return $last.' MB';  
    return $size;  
}

    4,socket方式

function getFileSize($url)  
{  
    $url = parse_url($url);  
    if($fp = @fsockopen($url['host'],empty($url['port'])?80:$url['port'],$error))  
    {  
        fputs($fp,"GET ".(empty($url['path'])?'/':$url['path'])." HTTP/1.1\r\n");  
        fputs($fp,"Host:$url[host]\r\n\r\n");  
        while(!feof($fp))  
        {  
            $tmp = fgets($fp);  
            if(trim($tmp) == '')  
            {  
                break;  
            }  
            elseif(preg_match('/Content-Length:(.*)/si',$tmp,$arr))  
            {  
                return trim($arr[1]);  
            }  
        }  
        return null;  
    }  
    else  
    {  
        return null;  
    }  
}

        以上是開發中使用過的四種方式,處理速度個人認為socket的方式較快,get_headers、file_get_contents比較慢。大伙根據實際情況來選擇合適的處理方式吧。

來自:http://my.oschina.net/xtfjt1988/blog/368448

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!