2016-01-09 60 views
1

我已經構建了一個腳本來下載一個rar/zip文件到2Gb,它開始下載,但在一段時間後停止。原因是什麼?我在php.ini變更並重新啓動服務器過但沒有任何工程:http://filecubic.com/info2.php:以下是代碼:大文件在一段時間後停止下載php

ini_set('memory_limit', '512M'); 
$filePath = "http://filecubic.com/download/1071/1.8_gb_fileteste_1452312029.rar"; // set your download file path here. 
download($filePath); // calls download function 

function download($filePath) { 
if (!empty($filePath)) { 
    $fileInfo = pathinfo($filePath); 
    $fileName = $fileInfo['basename']; 
    $fileExtnesion = $fileInfo['extension']; 
    $default_contentType = "application/octet-stream"; 
    $content_types_list = mimeTypes(); 
    // to find and use specific content type, check out this IANA page : http://www.iana.org/assignments/media-types/media-types.xhtml 
    if (array_key_exists($fileExtnesion, $content_types_list)) { 
     $contentType = $content_types_list[$fileExtnesion]; 
    } else { 
     $contentType = $default_contentType; 
    } 
    if (file_exists($filePath)) { 
     $size = filesize($filePath); 
     $offset = 0; 
     $length = $size; 
     //HEADERS FOR PARTIAL DOWNLOAD FACILITY BEGINS 
     if (isset($_SERVER['HTTP_RANGE'])) { 
      preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches); 
      $offset = intval($matches[1]); 
      $length = intval($matches[2]) - $offset; 
      $fhandle = fopen($filePath, 'r'); 
      fseek($fhandle, $offset); // seek to the requested offset, this is 0 if it's not a partial content request 
      $data = fread($fhandle, $length); 
      fclose($fhandle); 
      header('HTTP/1.1 206 Partial Content'); 
      header('Content-Range: bytes ' . $offset . '-' . ($offset + $length) . '/' . $size); 
     }//HEADERS FOR PARTIAL DOWNLOAD FACILITY BEGINS 
     //USUAL HEADERS FOR DOWNLOAD 
     header("Content-Disposition: attachment;filename=" . $fileName); 
     header('Content-Type: ' . $contentType); 
     header("Accept-Ranges: bytes"); 
     header("Pragma: public"); 
     header("Expires: -1"); 
     header("Cache-Control: no-cache"); 
     header("Cache-Control: public, must-revalidate, post-check=0, pre-check=0"); 
     header("Content-Length: " . filesize($filePath)); 
     $chunksize = 8 * (1024 * 1024); //8MB (highest possible fread length) 
     if ($size > $chunksize) { 
      $handle = fopen($_FILES["file"]["tmp_name"], 'rb'); 
      $buffer = ''; 
      while (!feof($handle) && (connection_status() === CONNECTION_NORMAL)) { 
       $buffer = fread($handle, $chunksize); 
       print $buffer; 
       ob_flush(); 
       flush(); 
      } 
      if (connection_status() !== CONNECTION_NORMAL) { 
       echo "Connection aborted"; 
      } 
      fclose($handle); 
     } else { 
      ob_clean(); 
      flush(); 
      readfile($filePath); 
     } 
    } else { 
     echo 'File does not exist!'; 
    } 
} else { 
    echo 'There is no file to download!'; 
} 
} 

/* Function to get correct MIME type for download */ 

function mimeTypes() { 
/* Just add any required MIME type if you are going to download something not listed here. */ 
$mime_types = array("323" => "text/h323", 
    "acx" => "application/internet-property-stream", 
    "ai" => "application/postscript", 
    "aif" => "audio/x-aiff", 
    "aifc" => "audio/x-aiff", 
    "aiff" => "audio/x-aiff", 
    "asf" => "video/x-ms-asf", 
    "asr" => "video/x-ms-asf", 
    "asx" => "video/x-ms-asf", 
    "au" => "audio/basic", 
    "avi" => "video/x-msvideo", 
    "axs" => "application/olescript", 
    "bas" => "text/plain", 
    "bcpio" => "application/x-bcpio", 
    "bin" => "application/octet-stream", 
    "bmp" => "image/bmp", 
    "c" => "text/plain", 
    "cat" => "application/vnd.ms-pkiseccat", 
    "cdf" => "application/x-cdf", 
    "cer" => "application/x-x509-ca-cert", 
    "class" => "application/octet-stream", 
    "clp" => "application/x-msclip", 
    "cmx" => "image/x-cmx", 
    "cod" => "image/cis-cod", 
    "cpio" => "application/x-cpio", 
    "crd" => "application/x-mscardfile", 
    "crl" => "application/pkix-crl", 
    "crt" => "application/x-x509-ca-cert", 
    "csh" => "application/x-csh", 
    "css" => "text/css", 
    "dcr" => "application/x-director", 
    "der" => "application/x-x509-ca-cert", 
    "dir" => "application/x-director", 
    "dll" => "application/x-msdownload", 
    "dms" => "application/octet-stream", 
    "doc" => "application/msword", 
    "dot" => "application/msword", 
    "dvi" => "application/x-dvi", 
    "dxr" => "application/x-director", 
    "eps" => "application/postscript", 
    "etx" => "text/x-setext", 
    "evy" => "application/envoy", 
    "exe" => "application/octet-stream", 
    "fif" => "application/fractals", 
    "flr" => "x-world/x-vrml", 
    "gif" => "image/gif", 
    "gtar" => "application/x-gtar", 
    "gz" => "application/x-gzip", 
    "h" => "text/plain", 
    "hdf" => "application/x-hdf", 
    "hlp" => "application/winhlp", 
    "hqx" => "application/mac-binhex40", 
    "hta" => "application/hta", 
    "htc" => "text/x-component", 
    "htm" => "text/html", 
    "html" => "text/html", 
    "htt" => "text/webviewhtml", 
    "ico" => "image/x-icon", 
    "ief" => "image/ief", 
    "iii" => "application/x-iphone", 
    "ins" => "application/x-internet-signup", 
    "isp" => "application/x-internet-signup", 
    "jfif" => "image/pipeg", 
    "jpe" => "image/jpeg", 
    "jpeg" => "image/jpeg", 
    "jpg" => "image/jpeg", 
    "js" => "application/x-javascript", 
    "latex" => "application/x-latex", 
    "lha" => "application/octet-stream", 
    "lsf" => "video/x-la-asf", 
    "lsx" => "video/x-la-asf", 
    "lzh" => "application/octet-stream", 
    "m13" => "application/x-msmediaview", 
    "m14" => "application/x-msmediaview", 
    "m3u" => "audio/x-mpegurl", 
    "man" => "application/x-troff-man", 
    "mdb" => "application/x-msaccess", 
    "me" => "application/x-troff-me", 
    "mht" => "message/rfc822", 
    "mhtml" => "message/rfc822", 
    "mid" => "audio/mid", 
    "mny" => "application/x-msmoney", 
    "mov" => "video/quicktime", 
    "movie" => "video/x-sgi-movie", 
    "mp2" => "video/mpeg", 
    "mp3" => "audio/mpeg", 
    "mpa" => "video/mpeg", 
    "mpe" => "video/mpeg", 
    "mpeg" => "video/mpeg", 
    "mpg" => "video/mpeg", 
    "mpp" => "application/vnd.ms-project", 
    "mpv2" => "video/mpeg", 
    "ms" => "application/x-troff-ms", 
    "mvb" => "application/x-msmediaview", 
    "nws" => "message/rfc822", 
    "oda" => "application/oda", 
    "p10" => "application/pkcs10", 
    "p12" => "application/x-pkcs12", 
    "p7b" => "application/x-pkcs7-certificates", 
    "p7c" => "application/x-pkcs7-mime", 
    "p7m" => "application/x-pkcs7-mime", 
    "p7r" => "application/x-pkcs7-certreqresp", 
    "p7s" => "application/x-pkcs7-signature", 
    "pbm" => "image/x-portable-bitmap", 
    "pdf" => "application/pdf", 
    "pfx" => "application/x-pkcs12", 
    "pgm" => "image/x-portable-graymap", 
    "pko" => "application/ynd.ms-pkipko", 
    "pma" => "application/x-perfmon", 
    "pmc" => "application/x-perfmon", 
    "pml" => "application/x-perfmon", 
    "pmr" => "application/x-perfmon", 
    "pmw" => "application/x-perfmon", 
    "pnm" => "image/x-portable-anymap", 
    "pot" => "application/vnd.ms-powerpoint", 
    "ppm" => "image/x-portable-pixmap", 
    "pps" => "application/vnd.ms-powerpoint", 
    "ppt" => "application/vnd.ms-powerpoint", 
    "prf" => "application/pics-rules", 
    "ps" => "application/postscript", 
    "pub" => "application/x-mspublisher", 
    "qt" => "video/quicktime", 
    "ra" => "audio/x-pn-realaudio", 
    "ram" => "audio/x-pn-realaudio", 
    "ras" => "image/x-cmu-raster", 
    "rgb" => "image/x-rgb", 
    "rmi" => "audio/mid", 
    "roff" => "application/x-troff", 
    "rtf" => "application/rtf", 
    "rtx" => "text/richtext", 
    "scd" => "application/x-msschedule", 
    "sct" => "text/scriptlet", 
    "setpay" => "application/set-payment-initiation", 
    "setreg" => "application/set-registration-initiation", 
    "sh" => "application/x-sh", 
    "shar" => "application/x-shar", 
    "sit" => "application/x-stuffit", 
    "snd" => "audio/basic", 
    "spc" => "application/x-pkcs7-certificates", 
    "spl" => "application/futuresplash", 
    "src" => "application/x-wais-source", 
    "sst" => "application/vnd.ms-pkicertstore", 
    "stl" => "application/vnd.ms-pkistl", 
    "stm" => "text/html", 
    "svg" => "image/svg+xml", 
    "sv4cpio" => "application/x-sv4cpio", 
    "sv4crc" => "application/x-sv4crc", 
    "t" => "application/x-troff", 
    "tar" => "application/x-tar", 
    "tcl" => "application/x-tcl", 
    "tex" => "application/x-tex", 
    "texi" => "application/x-texinfo", 
    "texinfo" => "application/x-texinfo", 
    "tgz" => "application/x-compressed", 
    "tif" => "image/tiff", 
    "tiff" => "image/tiff", 
    "tr" => "application/x-troff", 
    "trm" => "application/x-msterminal", 
    "tsv" => "text/tab-separated-values", 
    "txt" => "text/plain", 
    "uls" => "text/iuls", 
    "ustar" => "application/x-ustar", 
    "vcf" => "text/x-vcard", 
    "vrml" => "x-world/x-vrml", 
    "wav" => "audio/x-wav", 
    "wcm" => "application/vnd.ms-works", 
    "wdb" => "application/vnd.ms-works", 
    "wks" => "application/vnd.ms-works", 
    "wmf" => "application/x-msmetafile", 
    "wps" => "application/vnd.ms-works", 
    "wri" => "application/x-mswrite", 
    "wrl" => "x-world/x-vrml", 
    "wrz" => "x-world/x-vrml", 
    "xaf" => "x-world/x-vrml", 
    "xbm" => "image/x-xbitmap", 
    "xla" => "application/vnd.ms-excel", 
    "xlc" => "application/vnd.ms-excel", 
    "xlm" => "application/vnd.ms-excel", 
    "xls" => "application/vnd.ms-excel", 
    "xlt" => "application/vnd.ms-excel", 
    "xlw" => "application/vnd.ms-excel", 
    "xof" => "x-world/x-vrml", 
    "xpm" => "image/x-xpixmap", 
    "xwd" => "image/x-xwindowdump", 
    "z" => "application/x-compress", 
    "rar" => "application/x-rar-compressed", 
    "zip" => "application/zip"); 
return $mime_types; 
} 
+0

嘗試使用set_time_limit(0)增加最大時間限制; –

+0

@MarinoDiClemente我也試過這個,但不幸的是沒有工作 –

回答

0

嘗試下載該文件爲「塊」,這樣的事情:

set_time_limit(0); 
$file = @fopen($file_path,"rb"); 
while(!feof($file)) 
{ 
    print(@fread($file, 1024*8)); 
    ob_flush(); 
    flush(); 
} 

如果你有Apache,你可以使用mod_xsendfile,這使得下載更簡單,更快。你只需輸出一個頭文件,模塊負責處理其餘的內容。

這是關於使用PHP下載文件的好文章:The 「right way」 to handle file downloads in PHP