25 Stimmen

Komprimierung von Inhalten mit PHP ob_start() vs Apache Deflate/Gzip?

Die meisten Websites wollen ihre Inhalte komprimieren, um Bandbreite zu sparen. Bei Apache-Servern, auf denen PHP läuft, gibt es jedoch zwei Möglichkeiten, dies zu tun mit PHP oder mit Apache. Was ist also schneller oder einfacher für Ihren Server?

In PHP führe ich zum Beispiel die folgende Funktion am Anfang meiner Seiten aus, um sie zu aktivieren:

/**
 * Gzip compress page output
 * Original function came from wordpress.org
 */
function gzip_compression() {

    //If no encoding was given - then it must not be able to accept gzip pages
    if( empty($_SERVER['HTTP_ACCEPT_ENCODING']) ) { return false; }

    //If zlib is not ALREADY compressing the page - and ob_gzhandler is set
    if (( ini_get('zlib.output_compression') == 'On'
        OR ini_get('zlib.output_compression_level') > 0 )
        OR ini_get('output_handler') == 'ob_gzhandler' ) {
        return false;
    }

    //Else if zlib is loaded start the compression.
    if ( extension_loaded( 'zlib' ) AND (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) ) {
        ob_start('ob_gzhandler');
    }

}

El andere Option ist die Verwendung von Apache deflate oder gzip (beide sind sehr eng ). Um sie zu aktivieren, können Sie Ihrer .htaccess-Datei etwas wie das Folgende hinzufügen.

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php

Da PHP eine Skriptsprache ist (die von PHP geladen werden muss), würde ich annehmen, dass die Apache-Methode 1) stabiler und 2) schneller ist. Aber Annahmen haben in der realen Welt keine große Bedeutung.

Schließlich sollte man annehmen, dass angesichts der enormen finanziellen Unterstützung, die Windows... äh werden wir das nicht tun.

14voto

preinheimer Punkte 3680

Wir betreiben... eine Menge Webserver, die 60M/Uniques/Tag verarbeiten. Normalerweise ist das nicht erwähnenswert, aber Ihre Frage scheint auf Erfahrung zu beruhen.

Wir laufen mit der Durchführung in Apache. Was am anderen Ende herauskommt, ist dasselbe (oder fast dasselbe, so dass es keine Rolle spielt), unabhängig davon, welche Methode Sie wählen.

Wir haben uns aus mehreren Gründen für Apache entschieden:

  • Keine Wartung, wir haben es einfach eingeschaltet. Niemand muss eine Gehäusestruktur pflegen
  • Bei unseren Tests schnitten Server, bei denen Apache die Arbeit erledigte, geringfügig besser ab.
  • Der Apache wendet den Ausgabefilter auf alles an, nicht nur auf PHP. In manchen Fällen werden andere Arten von Inhalten auf demselben Server bereitgestellt, und wir möchten unsere .css- und .js-Dateien komprimieren

Ein Wort der Warnung: Einige Browser oder andere Anwendungen verfälschen absichtlich die Client-Header, die anzeigen, dass die Komprimierung unterstützt wird. Manche tun dies, um sich die Arbeit in Bezug auf die Sicherheit auf der Client-Seite zu erleichtern (man denke an Anwendungen wie Norton Internet Security und dergleichen). Sie können dies entweder ignorieren oder versuchen, zusätzliche Fälle hinzuzufügen, um die Anfragen so umzuschreiben, dass sie normal aussehen (die Browser unterstützen es, die Anwendung oder der Proxy hat es nur manipuliert, um sich selbst das Leben zu erleichtern).

Wenn Sie den Befehl flush() verwenden, um die Ausgabe früher an den Browser zu senden, und eine Komprimierung anwenden, müssen Sie das Ende der Zeichenkette mit Leerzeichen auffüllen, um den Server zu überzeugen, die Daten früher zu senden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X