2011-02-14 18 views
7

Un cliente mío decidió mover el sitio web de un servidor algo bueno a un ... vamos a llamarlo servidor menos bueno.¿Descarga de archivos en php, problema de límite de memoria?

El problema es que hay un archivo con 40MBs para ser descargado y el límite de memoria en el servidor es 32. Para que sea aún más difícil para mí, que no permiten fopen ...

Además, si reduzco el tamaño del archivo a 20 MB, funciona bien.

Entonces, mi pregunta es, ¿qué puedo hacer, además de reducir el tamaño del archivo, para que esto funcione?

Gracias

EDIT: `

 $fsize = filesize($file_path); 
     $path_parts = pathinfo($file_path); 
     $ext = strtolower($path_parts["extension"]); 


     switch ($ext) { 
      case "pdf": $ctype = "application/pdf"; 
       break; 
      case "exe": $ctype = "application/octet-stream"; 
       break; 
      case "zip": $ctype = "application/zip"; 
       break; 
      case "doc": $ctype = "application/msword"; 
       break; 
      case "xls": $ctype = "application/vnd.ms-excel"; 
       break; 
      case "ppt": $ctype = "application/vnd.ms-powerpoint"; 
       break; 
      case "gif": $ctype = "image/gif"; 
       break; 
      case "png": $ctype = "image/png"; 
       break; 
      case "jpeg": 
      case "jpg": $ctype = "image/jpg"; 
       break; 
      default: $ctype = "application/force-download"; 
     } 

     header("Pragma: public"); // required 
     header("Expires: 0"); 
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
     header("Cache-Control: private", false); // required for certain browsers 
     header("Content-Type: $ctype"); 
     header("Content-Disposition: attachment; filename=\"" . basename($file_path) . "\";"); 
     header("Content-Transfer-Encoding: binary"); 
     header("Content-Length: " . $fsize); 
     ob_clean(); 
     flush(); 
     readfile($file_path);` 

El código vi en php.net

// If it's a large file, readfile might not be able to do it in one go, so: 
$chunksize = 1 * (1024 * 1024); // how many bytes per chunk 
if ($size > $chunksize) { 
    $handle = fopen($realpath, 'rb'); 
    $buffer = ''; 
    while (!feof($handle)) { 
    $buffer = fread($handle, $chunksize); 
    echo $buffer; 
    ob_flush(); 
    flush(); 
    } 
    fclose($handle); 
} else { 
    readfile($realpath); 
} 
+0

¿Cómo es la sección principal de su phpinfo? ¿Podrías pegarlo? Si está buscando una solución rápida, es posible que pueda cambiar su configuración de php utilizando un archivo .htaccess. Son documentos de drupal, pero no son específicos de drupal. http://drupal.org/node/29268 y http://drupal.org/node/97193 – KyleWpppd

+0

¿Alguna parte en particular? (es un poco grande publicar todo aquí) –

+0

el código de php.net debería funcionar bien. simplemente quítese ob_ .. si no se usa. Si ob, considere agregar gz para una descarga más rápida. – Teson

Respuesta

3

Uso readfile() lugar. Transmitirá el archivo en pequeños fragmentos y manejará todo el trabajo de fondo para minimizar el uso de memoria.

+0

bueno, ya estoy usando la función readfile(). :/Mencioné la función fopen porque leí en php.net que para manejar una situación como la mía debería usar la función fopen y un buffer ... publicaré mi código –

+0

No encuentro nada en la documentación que sugiere fragmentos de archivos '' readfile'. ¿Cuidado para elaborar? – Phil

+0

No puedo "aceptar" la respuesta porque realmente no resuelve mi problema, pero lo encontré útil. Gracias. –