2011-07-21 16 views
5

Estoy desarrollando un servicio de carga de archivos para mi empresa. Nuestros usuarios a menudo nos envían archivos .zip muy grandes llenos de archivos ilustradores muy grandes. En general, los archivos no serán más grandes que 1.5GB, pero tengo que planear manejar archivos de hasta 4GB.Configuración de Apache para cargas grandes

Obviamente, esto causa muchas preocupaciones sobre cómo configuro mi Apache para permitir transferencias de archivos tan grandes sin sobrecargar mi servidor ni abrir agujeros de seguridad.

preocupación 1: Límites de memoria

Una característica de mi sistema es que los usuarios deben ser capaces de descargar sus archivos de nuevo después de que se les han subido. He evitado usar una descarga estándar (solo enlace al archivo) debido a problemas de seguridad. No puedo permitir que otros usuarios descarguen los archivos de los demás. Mi solución fue mantener los archivos cargados en un directorio protegido fuera de www-root y cargarlos a través de un script PHP. Ese script PHP se ve un poco como esto:

$fo = fopen($uploadDir.$file_name, "r"); 
while(!feof($fo)) { 
     $strang = fread($fo, 102400); 
     echo $strang; 
     ob_flush(); 
} 
fclose($fo); 

He puesto el fread en un bucle y bloqueada en cargar sólo pequeños trozos del archivo a la vez. Lo hice porque mi servidor solo tiene 4GB de RAM, y necesita poder manejar varias personas descargando al mismo tiempo (probablemente un máximo de 20 personas). Mi primera pregunta es qué tan grande de un pedazo debo leer a la vez. En este momento, descargar un archivo de 1,5 GB es extremadamente lento debido a ese tamaño de fragmento.

preocupación 2: Max Tiempo de ejecución

Otra cuestión de cargar/descargar dichos archivos de gran tamaño es el tiempo de ejecución máximo. Si bien todo es bastante rápido en mi red interna, debería estar preparado para usuarios con conexiones lentas. Estoy configurando mi tasa de carga más baja en 1Mbps, que es de aproximadamente 35 minutos para subirla. Seamos generosos y digamos que pueden descargar al doble de esa velocidad, por lo que 15 minutos de descarga.

¿Es un riesgo de seguridad establecer mi max_excution_time en 30 minutos? ¿Va a matar algo en mi servidor? No tengo ninguna razón para pensar que es una mala idea, pero mi instinto me grita que sería estúpido permitir que un script se ejecute tanto tiempo. ¿Hay una mejor manera de hacer lo que estoy tratando de hacer?


He visto algunas otras preguntas similares, y la mayoría sugirió usar algo como java o silverlight. Me gustaría, si hay alguna forma sensata, para evitar Java. Actualmente estoy usando swfupload y el complemento jQuery que lo acompaña.

+2

Para el problema de velocidad de descarga de archivos, tal vez una respuesta mía antigua podría ayudar: http://stackoverflow.com/questions/3697748/fastest-way-to-serve-a-file-using-php/3731639#3731639 –

+0

Amo ese método. ¿Funciona si tengo mis archivos en un directorio protegido? ¿O necesitan estar disponibles en el servidor web? Lo tengo configurado en este momento pero no funciona ... y realmente no le doy ninguna información de error. – jwegner

+1

¿Con "X-SendFile"? El archivo solo necesita ser legible por el usuario que ejecuta el proceso del servidor web. –

Respuesta

1

Preocupación 1: Límites de memoria

readfile corrientes, por lo que este se convierte en la respuesta HTTP sobre la marcha y no se cargan en la memoria completado.

Para las cargas, sin embargo, la secuencia de comandos debe tener suficiente memoria porque al cargar y usar PHP, todo el archivo entra en la memoria si no recuerdo mal.

preocupación 2: Max Tiempo de ejecución

Si está preocupado por la seguridad, manejar la autenticación y derechos de acceso ya través del servidor HTTPD. Entonces su script no se ejecutará cuando la solicitud no sea válida.

Cuestiones relacionadas