2012-09-02 39 views
5

Básicamente, me gustaría enviar un encabezado X-Sendfile al navegador para enviar un archivo, pero no quiero llamar a esto si el X-Sendfile no está disponible o no está instalado en el servidor. ¿Cómo puedo verificar esto en PHP? ¿O si esto es imposible de verificar en PHP, que cómo comprobar que está instalado PERIODO? Preferiría verificar la existencia de X-Sendfile en PHP, ya que sería más fácil para mí hacerlo, ya que es parte de un paquete que también se ejecutará en otros sitios y servidores ... Tal vez si solo uso con la función PHP header, ¿devolverá algo si no está instalado?PHP - ¿Cómo saber si X-Sendfile está disponible e instalado?

chicos

gracias :)

Respuesta

6

El módulo de Apache mod_xsendfile procesos los encabezados

Para comprobar si el módulo mod_xsendfile APACHE está disponible y se instala en el servidor, se puede usar apache_get_modules() función.

No puede simplemente configurar el encabezado y verificar si el módulo está instalado o no.

+0

Guarde su "gracias" por otra persona. Estoy más que feliz de haberte ayudado. – verisimilitude

+3

No se olvide: el módulo podría estar cargado (enumerado en apache_get_modules(), pero podría no estar activado (incluso está deshabilitado de manera predeterminada). No puede verificar esto con PHP. – marcovtwout

0

Prueba esto:

if (in_array('mod_xsendfile', apache_get_modules())) { 
     header("X-Sendfile: $file"); 
    } else { 
     error_log("Warning! mod-xsendfile is NOT INSTALLED - sending file the old fashion way....."); 
     header('Content-Length: ' . filesize($file)); 
     print file_get_contents($file); 
    } 
+0

¿por qué no usa readfile en "el de la vieja manera "? –

+2

xsendfile saldrá de PHP y liberará la memoria, y permitirá que apache envíe el archivo usando DMA/aceleración de hardware. Si usa readfile está pasando los datos a través de múltiples búferes y duplicándolos en la memoria (PHP lee el archivo en memoria -> buffer de salida php -> buffer de salida apache -> buffer de red) todo lo cual se hace en el procesador en lugar de sendfile (Apache le dice a Harddrive que cargue archivos directamente en la memoria usando DMA, apache le dice a la tarjeta de red que envíe datos leyendo directamente desde la memoria, el procesador es libre de hacer otras cosas en lugar de copias de memoria innecesarias) – RobertMaysJr

+0

No estaba debatiendo los méritos de xsendfile, pero la impresión de "a la antigua usanza". Primero incluso el eco es más rápido que la impresión y el segundo archivo de lectura es más rápido que los dos, especialmente si tiene que file_get_contents algo antes de repetirlo. –

0

Esto no es correcto. Si XSendFile no está configurado en Activado para la ubicación relevante pero el módulo está cargado, asumirá falsamente que el uso de xsendfile está disponible, aunque no es así.

Cuestiones relacionadas