php无法获得远程文件大小

来源:互联网 发布:橙光立绘制作软件 编辑:程序博客网 时间:2024/06/05 14:23

今天,用户反映软件打开后就挂掉,分析程序得php无法从服务器获取文件大小,atoi函数中的参数为空,程序挂掉了。

很奇怪的是以前程序都没问题,今天突然所有的用户都出现这个问题,通过@fsockopen()的错误提示,知道了服务器无法解析文件url地址。

将文件的url地址改成本地地址,因为文件都存放在服务器上,所以直接用了本地路径。然后通过filesize函数直接得到文件的大小。

这种方法比@fsockopen()更快,应该说是相当快。

附上php常用获取文件大小的方法:

1、get_headers

<?php 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 ) ?> 

2、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; } 


3、fsock

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.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;     } }


4、file_get_contents

$fCont = file_get_contents($url); echo strlen($fCont)/1024;



原创粉丝点击