2012-06-13 12 views
6

He intentado todos los encabezados. Con y sin contenido de longitud.900 MB de descargas obligatorias http rara vez terminan

El problema es que la descarga se produce a la mitad. Pero solo la mayor parte del tiempo.

A veces funciona bien.

El uso de recursos del servidor es trivial. Todos los archivos de configuración están bien. No ejecuto el script php mientras está en marcha.

¿Alguien ha visto esto antes? ¿Ni siquiera es mi culpa? ¿Por qué a veces?

$file = "http://domain.com/files/".$item_number.".mov"; 
header('Pragma: no-cache'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Content-Description: File Download'); 
header('Content-Type: application/force-download'); 
//header ('Content-Type: video/quicktime');//doesnt seem to download at all here 
header('Content-Length: '.filesize($file)); 
header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
header('Content-Transfer-Encoding: binary'); 
readfile($file); 
exit(); 

Gracias, Lo siento, es mi primera vez.

+4

¿Esta descarga se realiza a través de un script PHP? ¿Puedes mostrarnos el código? –

+3

Deje de hacer preguntas de cierre simplemente porque un novato se lo pide. Esta es una pregunta 100% real. –

+0

¿Has echado un vistazo a tus archivos de registro? PD: Código, por favor. – xbonez

Respuesta

3

Esto puede deberse a varios motivos.

Usted dice que los recursos del servidor son correctos, pero creo que PHPs readfile() carga todo el archivo en la memoria antes de enviarlo. Afortunadamente hay un buen solution en los documentos que definitivamente deberías usar para evitar problemas con múltiples descargas :)

Además, ¿estableciste el tiempo de ejecución de scripts en infinito?

Siguiente sería la configuración de su servidor. Tal vez cierren la conexión por algún motivo de tiempo de espera/recurso.

Utilice, por ejemplo, la herramienta de desarrollador Google Chromes para examinar de cerca los encabezados que está enviando. PHP establece algunos encabezados por sí mismo. Debe poner session_cache_limiter(false); al comienzo de su script. Si mal no recuerdo, incluso Expires: Thu, 19 Nov 1981 08:52:00 GMT ... ¿Por qué es malo? Próximamente;)

Puede enviar el Etag y el encabezado Last-Modified. En resumen, es un identificador único para su recurso, que hace posible reanudar las descargas. Creo que buscar buenos artículos sobre esto es mejor que solo darte algunas frases aquí. En su caso, puede utilizar la función PHP stat() para crear un Etag.

hay algunas personas que luchan con los encabezados y descargas, usted podría comenzar (o arreglar su caso) here

Resumen:

  • Repase su/limitaciones de la caducidad PHP/servidor/recurso
  • Asegúrese de enviar el archivo con almacenamiento intermedio
  • Hacer posible reanudar las descargas
  • Compruebe los encabezados que está enviando

Después de esto, debería estar bien. Con la reanudación incluso si todavía se rompe ...

¡Buen progreso y éxito!

+1

Desde el manual "readfile() no presentará ningún problema de memoria, incluso al enviar archivos grandes, por sí solo. Si encuentra un error de falta de memoria, asegúrese de que el búfer de salida esté desactivado con ob_get_level()." – Matthew

+0

Quizás host compartido u otra cosa - Acabo de resumir todo lo que sé que podría ser la razón :) readfile() no presentará un problema de memoria * SI * ... Definitivamente es uno de la lista. –

+0

http://stackoverflow.com/questions/6627952/why-does-readfile-exhaust-php-memory basura del servidor, varios usuarios, básicamente, lo que dije, y lo principal es eliminar a los cerdos de recursos como este –

Cuestiones relacionadas