2010-06-01 18 views
5

Al configurar un sistema de gestión de archivos en línea, y ahora he tocado un bloque.PHP readfile() y grandes descargas

estoy tratando de empujar el archivo al cliente usar este modified version of readfile:

function readfile_chunked($filename,$retbytes=true) { 
    $chunksize = 1*(1024*1024); // how many bytes per chunk 
    $buffer = ''; 
    $cnt =0; 
    // $handle = fopen($filename, 'rb'); 
    $handle = fopen($filename, 'rb'); 
    if ($handle === false) { 
     return false; 
    } 
    while (!feof($handle)) { 
     $buffer = fread($handle, $chunksize); 
     echo $buffer; 
     ob_flush(); 
     flush(); 
     if ($retbytes) { 
      $cnt += strlen($buffer); 
     } 
    } 
     $status = fclose($handle); 
    if ($retbytes && $status) { 
     return $cnt; // return num. bytes delivered like readfile() does. 
    } 
    return $status; 
} 

Pero cuando trato de descargar un archivo de 13 MB, es sólo romper a 4 MB. ¿Cuál sería el problema aquí? Definitivamente no es el límite de tiempo de ningún tipo porque estoy trabajando en una red local y la velocidad no es un problema.

El límite de memoria en PHP se establece en 300 MB.

Gracias por cualquier ayuda.

+2

Es casi seguro que hay algo en el registro de errores, suponiendo que lo tiene activado. Verifique y enmiende la pregunta. – timdev

+0

No. Nada relacionado con esto en el registro de errores. Todo lo que tengo es algunas advertencias de desaprobación de diferentes scripts. – Nirmal

+0

¿Qué cliente está usando para descargar el contenido? ¿El comportamiento cambia si usa un cliente diferente? Mi idea es que el agente que está utilizando no puede hacer frente a una gran codificación fragmentada. Pruebe con un cliente diferente/y/o detecte el tráfico. – symcbean

Respuesta

4

Lo más probable es que esté llegando al límite del búfer de respuesta establecido por su servidor web. Se sabe que IIS y FastCGI tienen 4mb como tamaño de búfer predeterminado. Comenzaría su búsqueda mirando en el servidor web < -> Configuración PHP SAPI.

+0

¿Hay alguna otra desventaja en el aumento del límite del buffer? ¿Establecerlo en, digamos, 50 MB crea un problema para la experiencia general de navegación? Gracias por cualquier idea. – Nirmal

+0

Ninguno, además de la huella de memoria potencial del servidor web, y la memoria es barata ahora. – m1tk4

+0

'Nota:" Ojalá tuviera más respuestas para la pregunta, pero como la recompensa estaba a punto de terminar, tenía que dársela a esta respuesta. – Nirmal

1

NO limpie la salida pero intente almacenarla en el búfer y luego envíela al cliente de una pieza.

ob_clean(); // in case anything else was buffered 
ob_start(); 

// do read/echo operations 

ob_end_flush(); 
+0

¿Por qué iba a hacer eso? El objetivo de utilizar la función readline() de reemplazo es evitar leer todo el archivo en el espacio de memoria de PHP a la vez. Tu respuesta derrota por completo ese propósito. – timdev

+0

@timdev - ¿Quisiste decir 'función readfile()'? Sí, tiene usted razón. El envío del archivo como una pieza completa es lo que queremos evitar aquí. – Nirmal

+0

@Nirmal, er, sí, duh. – timdev

Cuestiones relacionadas