2012-09-02 6 views
5

Grundsätzlich möchte ich einen Header X-Sendfile an den Browser senden, um eine Datei zu senden, aber ich möchte dies nicht aufrufen, wenn die X-Sendfile nicht verfügbar oder auf dem Server installiert ist. Wie kann ich das in PHP überprüfen? Oder wenn es unmöglich ist, in PHP nachzuschauen, als wie man überprüft, ob es PERIOD installiert ist? Ich würde lieber nach der Existenz von X-Sendfile in PHP suchen, da es für mich einfacher wäre, da dies Teil eines Pakets ist, das auch auf anderen Sites und Servern läuft ... Vielleicht, wenn ich es einfach benutze es mit der PHP header Funktion wird es etwas zurückgeben, wenn nicht installiert ??PHP - Wie finde ich heraus, ob X-Sendfile verfügbar und installiert ist?

Danke Jungs :)

Antwort

6

Die APACHE-Modul mod_xsendfile verarbeitet der Header

Um zu überprüfen, ob der APACHE Modul mod_xsendfile auf dem Server verfügbar und installiert ist, können Sie apache_get_modules() Funktion verwenden.

Sie können nicht einfach die Kopfzeile einstellen und prüfen, ob das Modul installiert ist oder nicht.

+0

Speichern Sie Ihre "Danke" für jemand anderen. Ich bin mehr als froh, dir geholfen zu haben. – verisimilitude

+3

Nicht vergessen: Das Modul ist möglicherweise geladen (aufgeführt in apache_get_modules(), aber möglicherweise nicht On (es ist sogar standardmäßig deaktiviert). Sie können dies nicht mit PHP überprüfen. – marcovtwout

1

Um eine Liste von Apache-Module und sehen, ob x-sendfile in der Liste ist Sie http://php.net/manual/en/function.apache-get-modules.php verwenden könnten, wenn es nicht installiert ist, die x-sendfile-Header an den Browser erhalten, wenn es installiert ist, das Modul wird den Header herausfiltern.

0

Try this:

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

warum benutzen Sie nicht einfach readfile in "the altmodischer Weg "? –

+2

xsendfile wird PHP beenden und den Speicher freigeben, und Apache erlauben, die Datei mit DMA/Hardwarebeschleunigung zu senden. Wenn Sie readfile verwenden, leiten Sie die Daten durch mehrere Puffer und duplizieren es im Speicher (PHP liest Datei in Speicher -> PHP-Ausgabepuffer -> Apache-Ausgabepuffer -> Netzwerkpuffer) All dies erfolgt im Prozessor im Gegensatz zu sendfile (Apache sagt Harddrive, Datei direkt in den Speicher mit DMA zu laden, sagt Apache Netzwerkkarte, um Daten durch Lesen zu senden direkt aus dem Speicher, Prozessor ist frei, andere Dinge anstelle von unnötigen Speicherkopien zu tun) – RobertMaysJr

+0

Ich debattierte nicht die Vorzüge von xsendfile, aber der Druck in "der alten Mode". Erstens sogar echo ist schneller als print und zweite readdatei ist schneller als beide, vor allem, wenn sie file_get_contents etwas vor dem echo müssen. –

0

Dies ist nicht korrekt. Wenn XSendFile für den relevanten Speicherort nicht auf Ein gesetzt ist, aber das Modul geladen ist, wird fälschlicherweise davon ausgegangen, dass die XSendfile-Verwendung verfügbar ist, obwohl dies nicht der Fall ist.