PHP 获取远程文件大小常用方法总结
php有很多方法可以获取远程文件大小的,最常用的就有fsockopen、file_get_contents、curl函数,下面我来给各位总结一下.
1、fsockopen,代码如下:
- <?php
- function getFileSize($url){
- $url = parse_url($url);
- if($fp = @fsockopen($url['host'],emptyempty($url['port'])?80:$url['port'],$error)){
- fputs($fp,"GET ".(emptyempty($url['path'])?'/':$url['path'])." HTTP/1.1rn");
- fputs($fp,"Host:$url[host]rnrn");
- while(!feof($fp)){
- $tmp = fgets($fp);
- if(trim($tmp) == ''){
- break;
- }else if(preg_match('/Content-Length:(.*)/si',$tmp,$arr)){
- return trim($arr[1]);
- }
- }
- return null;
- }else{
- return null;
- }
- }
- //调用方法
- echo getFileSize("http://www.phpfensi.com/")
- ?>
2、使用file_get_contents(),代码如下:
- <?php
- $file = file_get_contents($url);
- echo strlen($file);
- ?>
3. 使用get_headers(),代码如下:
- <?php
- $header_array = get_headers($url, true);
- //返回结果
- Array
- (
- [0] => HTTP/1.1 200 OK
- [Date] => Sat, 29 May 2004 12:28:14 GMT
- [Server] => Apache/1.3.27 (Unix) (Red-Hat/Linux)
- [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
- [ETag] => "3f80f-1b6-3e1cb03b"
- [Accept-Ranges] => bytes
- [Content-Length] => 438
- [Connection] => close
- [Content-Type] => text/html
- )
- $size = $header_array['Content-Length'];
- echo $size;
- ?>
4.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]))
- { //开源代码phpfensi.com
- $size = $matches[1];
- }
- else
- {
- $size = 'unknown';
- }
- //$last=round($size/(1024*1024),3);
- //return $last.' MB';
- return $size;
- }