2010-07-06 28 views
5

Necesito entregar archivos de gran tamaño (> 2 gb) desde un servidor web Apache. Los archivos son descargas protegidas, así que necesito algún tipo de forma de autorizar al usuario. El CMS que uso utiliza cookies comprobadas en una base de datos MySQL para verificar al usuario. En el servidor, no tengo control sobre max_execution_time y control limitado sobre memory_limit.Sirviendo archivos grandes protegidos en PHP/Apache

Mi técnica ha estado trabajando para archivos pequeños. Después de que el usuario ha sido autorizado en PHP (por el CMS), uso readfile() para servir el archivo, que se almacena sobre la raíz del documento para evitar el acceso directo. He leído sobre técnicas para dividir la descarga o usar fpassthru para superar el límite de memoria de PHP. Pero no he encontrado una técnica para superar el límite de max_execution_time.

Pensé en guardar el archivo dentro de la raíz del documento, por lo que podía omitir por completo PHP. Pero lo que no puedo entender es cómo restringir el acceso con htaccess. Necesito verificar al usuario contra la base de datos antes de que pueda servirles el archivo.

Gracias.

+0

¿Has probado usar set_time_limit (0)? – igorw

Respuesta

3

La mejor solución en mi opinión: instale mod_xsendfile en su Apache, haga que el script PHP autorice al usuario, y en caso de éxito envíe una respuesta con un encabezado apuntando a la ubicación del archivo protegido. Desde ese momento, Apache hace el trabajo de servir el archivo al cliente; no PHP

+0

+1 para 'mod_xsendfile'. No hagas esto en PHP. Apache (o cualquier servidor web de calidad de producción, para el caso) está optimizado para servir archivos. Deje que haga su trabajo y retire el intérprete de guiones. Lighttpd admite el mismo encabezado y Nginx hace lo mismo, pero con 'X-Accel-Redirect'. –

+1

mod_xsendfile es la solución ** mejor **. Sin embargo, si esto no está disponible para usted (alojamiento compartido/construcción estática), entonces le recomiendo usar enlaces simbólicos o enlaces duros (como se menciona a continuación), ya que con eso puede pasar la porción de la descarga al servidor web. –

+1

Los enlaces son seguridad a través de la oscuridad. Nada impide que un usuario final comparta esos enlaces. Eso está bien en algunos casos, pero seamos honestos sobre las concesiones. –

1

Qué acerca del uso de los links? Si usted tiene una carpeta de ejemplo:

userfacingfiles/ 
    md5_of_order_id1 --> protected-file.exe 
    md5_of_order_id2 --> protected-file.exe 

protectedfiles/ 
    .htaccess (contains deny from all) 
    protected-file.exe 

Ejemplo básica:

$salt = 'canttouchthis'; 

function create_symlink($order_id, $salt, $protected_file) 
{ 
    $info = pathinfo('protectedfiles/'.$protected_file); 

    symlink('protectedfiles/'.$protected_file, 'userfacingfiles/'.md5($order_id.$salt).'.'.$info['extension']); 
} 


function get_file($order_id, $salt, $extension) 
{ 

    header('Location: userfacingfiles/'.md5($order_id.$salt).'.'.$extension); 
    exit(); 
} 

uso:

Cuando el usuario paga:

create_symlink(1, 'secureSALT', 'ebook.pdf'); 

Cuando el usuario desea descargue su ebook

get_file(1, 'secureSALT'); 

esto puede no ser el método más portátil, pero debido a que está redirigiendo al usuario del servidor web es el manejo de las descargas.

Cuestiones relacionadas