PHP获取本地文件、远程文件的大小

jopen 5年前

  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