W3docs

PHP ob_gzhandler() Funktion: Alles, was Sie wissen müssen

Die PHP-Funktion ob_gzhandler() komprimiert die Ausgabe Ihrer Skripte per gzip, spart Bandbreite und beschleunigt das Laden von Seiten.

Das Komprimieren von HTML, CSS oder JSON, bevor es den Server verlässt, spart Bandbreite und lässt Seiten schneller laden. PHPs eingebaute Funktion ob_gzhandler() ist ein fertiger Weg, dies direkt in Ihrem Skript zu tun: Sie übergeben sie an den Output-Buffer, und er gzip-komprimiert alles, was Ihr Skript ausgibt – aber nur dann, wenn der Browser anzeigt, dass er es dekomprimieren kann. Dieser Artikel behandelt die Syntax, ein vollständiges Beispiel, die Aushandlung mit dem Client, typische Fallstricke und wann Sie diese Funktion verwenden sollten, anstatt die Komprimierung dem Server zu überlassen.

Was die ob_gzhandler() Funktion bewirkt

ob_gzhandler() ist ein Callback, der an ob_start() übergeben wird. Sie rufen sie nie direkt auf — stattdessen ruft das Output-Buffering-System sie mit dem gepufferten Inhalt als Argument auf und gibt die komprimierten (oder, wenn keine Komprimierung möglich ist, unveränderten) Bytes zurück.

Vor der Komprimierung prüft sie den Accept-Encoding-Header der Anfrage und wählt das am besten unterstützte Schema:

  • Unterstützt der Client gzip, komprimiert sie mit gzip und setzt Content-Encoding: gzip.
  • Unterstützt der Client nur deflate, wird stattdessen deflate verwendet.
  • Unterstützt der Client keines von beidem, wird der Inhalt unverändert zurückgegeben und ob_start() schlägt fehl (gibt false zurück), sodass die Antwort unkomprimiert gesendet wird.

Da sie die Response-Header Content-Encoding und Vary automatisch setzt, müssen Sie sie vor jeglicher Ausgabe registrieren — siehe headers_sent(), wenn Sie auf einen „headers already sent"-Fehler stoßen.

Syntax

ob_start("ob_gzhandler");

ob_gzhandler() nimmt intern zwei Parameter entgegen ($buffer und $mode), die Sie jedoch nie selbst angeben — das erledigt die Buffering-Engine. Sie registrieren lediglich den String "ob_gzhandler" als Callback-Namen.

Ein vollständiges Beispiel

<?php

ob_start("ob_gzhandler");
echo "This will be compressed using gzip compression";
ob_end_flush();
?>

Hier öffnet ob_start() einen Output-Buffer mit ob_gzhandler() als Handler, das echo schreibt in diesen Buffer statt direkt zum Client, und ob_end_flush() schließt den Buffer und sendet seinen (nun komprimierten) Inhalt. Aus Sicht des Besuchers ändert sich nichts — der Browser dekomprimiert die Antwort transparent —, aber es werden weniger Bytes über das Netzwerk übertragen.

Fallback für Clients ohne gzip-Unterstützung

ob_start("ob_gzhandler") gibt false zurück, wenn der Client weder gzip noch deflate unterstützt. Ignorieren Sie das, wird kein Buffer gestartet, und ein späteres ob_end_flush() erzeugt eine Warnung. Prüfen Sie den Rückgabewert und weichen Sie auf einen einfachen Buffer aus:

<?php
if (!ob_start("ob_gzhandler")) {
    ob_start(); // plain buffer, no compression
}
echo "Served either compressed or uncompressed, but always buffered.";
ob_end_flush();
?>

Den Komprimierungsgrad festlegen

ob_start() akzeptiert keinen Komprimierungsgrad — ob_gzhandler() verwendet den zlib-Standard (gesteuert durch die INI-Einstellung zlib.output_compression_level, Standard -1). Um einen bestimmten Grad von 1 (schnellste, geringste Komprimierung) bis 9 (langsamste, kleinste Größe) zu erzwingen, überspringen Sie ob_gzhandler() und verwenden Ihren eigenen Callback mit gzencode():

<?php
ob_start(function ($buffer) {
    return gzencode($buffer, 9);
});
echo "Compressed at the maximum level.";
ob_end_flush();
?>

Beachten Sie, dass dieser benutzerdefinierte Callback Accept-Encoding nicht aushandelt und Content-Encoding: gzip auch nicht für Sie setzt — das erledigt ob_gzhandler() beides automatisch. Wenn Sie eine eigene Lösung implementieren, müssen Sie diese Header selbst senden, weshalb ob_gzhandler() für den üblichen Anwendungsfall praktischer bleibt.

ob_gzhandler() vs. zlib.output_compression

PHP bietet eine zweite, noch einfachere Möglichkeit, die Ausgabe zu komprimieren: die INI-Direktive zlib.output_compression. Setzen Sie sie auf On (oder einen Byte-Schwellenwert), und PHP gzippt die gesamte Antwort ganz ohne Code:

zlib.output_compression = On

Die beiden Ansätze schließen sich gegenseitig aus — wenn Sie zlib.output_compression aktivieren und gleichzeitig ob_start("ob_gzhandler") aufrufen, wird eine Warnung ausgelöst und nichts doppelt komprimiert. Bevorzugen Sie zlib.output_compression, wenn Sie php.ini bearbeiten oder ini_set() verwenden können, und nutzen Sie ob_gzhandler() nur in Fällen, in denen Sie die Konfiguration eines Skripts nicht steuern können.

Häufige Fallstricke

  • Keine gzip-Schichten verschachteln. Die Kombination von ob_gzhandler() mit serverseitiger Komprimierung (Nginx/Apache gzip) oder zlib.output_compression kann zu korrumpierten, doppelt kodierten Antworten führen.
  • Zuerst registrieren. Jedes vorherige echo, Leerzeichen vor <?php oder ein BOM in der Datei sendet Header vorzeitig und bricht die Komprimierung.
  • Nicht für bereits komprimierte Binärdaten. Das Gzippen von JPEGs, PNGs oder ZIPs kostet CPU-Zeit bei kaum messbarem Größengewinn.
  • Die zlib-Erweiterung wird benötigt. ob_gzhandler() erfordert, dass PHP mit zlib gebaut wurde (das ist fast immer der Fall, aber bei minimalen Builds erwähnenswert).

Fazit

Die Funktion ob_gzhandler() bietet eine einfache, in sich geschlossene Möglichkeit, PHP-Ausgaben zu gzippen: Registrieren Sie sie als Callback bei ob_start(), und sie handelt die Kodierung aus und setzt die Header für Sie. In modernen Umgebungen wird jedoch serverseitige Komprimierung (Nginx, Apache) oder ein CDN, das gzip/brotli übernimmt, meist bevorzugt — es entlastet PHP von der CPU-Arbeit und komprimiert auch statische Assets. Das Wissen über ob_gzhandler() bleibt dennoch relevant für Legacy-Codebasen und Skripte, bei denen Sie die Serverkonfiguration nicht anpassen können. Einen umfassenderen Überblick über die Arbeit mit Buffern finden Sie unter PHP Output Control.

Übungen

Übung
Was ist der Zweck von ob_gzhandler in PHP?
Was ist der Zweck von ob_gzhandler in PHP?
Was this page helpful?