Start · Sprachen · PHP · Referenz · ob_gzhandler

ob_gzhandler

Funktion

Callback-Funktion für <code>ob_start()</code>, die den Ausgabepuffer mit gzip, deflate oder zlib komprimiert, sofern der Client dies unterstützt.

seit PHP 4.0.4 Kategorie: io

Signatur

ob_gzhandler(string $output, int $flags): string|false

Beschreibung

ob_gzhandler() ist eine fertige Callback-Funktion, die direkt an ob_start() übergeben werden kann. Sie prüft automatisch den Accept-Encoding-Header des HTTP-Clients und komprimiert die gepufferte Ausgabe entsprechend mit gzip, deflate oder zlib. Unterstützt der Browser keine Komprimierung, wird die Ausgabe unkomprimiert zurückgegeben.

Der typische Einsatz sieht so aus: ob_start('ob_gzhandler'); am Anfang eines Skripts. Alle Ausgaben werden dann gesammelt und beim Flushen automatisch komprimiert an den Browser gesendet. Das reduziert die übertragene Datenmenge oft erheblich (häufig um 60–80 %), was die Ladezeit von HTML- oder JSON-Responses spürbar verbessert.

Die Funktion setzt bei erfolgreicher Komprimierung automatisch die notwendigen HTTP-Header Content-Encoding und Vary: Accept-Encoding. Daher darf sie nicht gleichzeitig mit der zlib.output_compression-PHP-INI-Direktive verwendet werden, da dies zu doppelter Komprimierung und damit zu ungültigen Responses führt.

Statt ob_gzhandler manuell zu verwenden, empfehlen viele moderne Setups die Aktivierung von zlib.output_compression in der php.ini oder die Nutzung von Webserver-Modul-Komprimierung (z. B. mod_deflate in Apache oder gzip in Nginx), da diese effizienter und zentraler konfigurierbar sind.

Parameter

Name Typ Default Beschreibung
$output Pflicht string Der Inhalt des Ausgabepuffers, der komprimiert werden soll. Wird automatisch von ob_start() übergeben.
$flags Pflicht int Bitmaske mit Puffer-Status-Flags (z. B. PHP_OUTPUT_HANDLER_START, PHP_OUTPUT_HANDLER_CONT, PHP_OUTPUT_HANDLER_END). Wird automatisch von ob_start() übergeben und steuert das Verhalten beim Flushen.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den (ggf. komprimierten) Ausgabe-String zurück, oder false, wenn die Komprimierung nicht möglich ist (z. B. weil der Client keine Komprimierung unterstützt oder zlib.output_compression aktiviert ist).

Beispiele

Grundlegende Verwendung mit ob_start

<?php
// ob_gzhandler als Callback an ob_start übergeben
ob_start('ob_gzhandler');

// Normale Ausgabe – wird automatisch komprimiert, wenn der Browser es unterstützt
echo '<html><body>';
echo '<h1>Willkommen!</h1>';
echo '<p>Diese Seite wird komprimiert übertragen, sofern der Browser dies unterstützt.</p>';
echo '</body></html>';

// ob_end_flush() leert den Puffer, ob_gzhandler komprimiert dabei
ob_end_flush();

Prüfung auf Konflikte mit zlib.output_compression

<?php
// Sicherheitscheck: ob_gzhandler nicht zusammen mit zlib.output_compression verwenden
if (ini_get('zlib.output_compression')) {
    // Keine zusätzliche Komprimierung nötig – Ausgabepuffer ohne Handler starten
    ob_start();
    echo 'zlib.output_compression ist aktiv – kein ob_gzhandler nötig.';
    ob_end_flush();
} else {
    // ob_gzhandler sicher verwenden
    ob_start('ob_gzhandler');
    echo 'Komprimierung via ob_gzhandler aktiv.';
    ob_end_flush();
}

// Wichtig · Fallstricke

Doppelte Komprimierung vermeiden: ob_gzhandler darf nicht gleichzeitig mit der PHP-INI-Option zlib.output_compression = On verwendet werden. Die Kombination führt zu ungültig kodierten HTTP-Responses, die Browser nicht dekodieren können.

Header bereits gesendet: Wie bei jeder Ausgabepufferung müssen vor dem ersten echo oder direkter Ausgabe alle HTTP-Header gesendet werden dürfen – d. h. ob_start('ob_gzhandler') muss aufgerufen werden, bevor irgendwelche Headers per header() gesetzt wurden, die mit Content-Encoding kollidieren.

Alternative: Für Produktionsumgebungen ist die Aktivierung der Komprimierung auf Webserver-Ebene (Apache mod_deflate, Nginx gzip) oder via zlib.output_compression in der php.ini oft die bessere Wahl, da sie für alle PHP-Skripte zentral gilt und keinen PHP-Overhead erzeugt.