Kann jemand erklären, warum ich den folgenden Fehler erhalte?
Wenn im Code der echo $gz;
auskommentiert ist, erhalte ich keinen Fehler (aber auch keine Ausgabe!), wenn es nicht geht (von Firefox),
Fehler bei der Inhaltscodierung
Die Seite, die Sie versuchen zu sehen, kann nicht angezeigt werden weil es ein ungültiges oder verwendet nicht unterstützte Form der Komprimierung.
Danke für Ihre Hilfe, hier ist der Code:
%Vor%Die Ausgabe Ihrer Anwendung sollte nur eine Ausgabecodierung enthalten. Wenn Sie mehrere Chunks haben, die unterschiedlich codiert sind, erhält der Browser ein Ergebnis, mit dem nicht gearbeitet werden kann. Daher der Kodierungsfehler.
Kohana selbst verwendet bereits den Ausgabepuffer. Wenn Sie das mit Ihrem Ausgabepuffer ob_gzhandler kombinieren wollen, müssen Sie Ihren Puffer starten, bevor kohana seinen eigenen initialisiert hat. Das liegt daran, dass Ausgabepuffer stapelbar sind. Wenn kohana die Ausgabepufferung beendet hat, wird Ihre Anwendung angewendet:
%Vor% Also, wann immer kohana etwas ausgegeben hat, werden diese Stücke in Ihren Output-Callback () weitergeleitet ob_gzhandler()
) und wird gz-codiert.
Der Browser sollte dann nur gz-codierte Daten erhalten, da es der Ausgabepuffer auf der obersten Ebene war.
Wenn Sie ob_start('ob_gzhandler')
verwenden, um PHP mit der Komprimierung umgehen zu lassen, und Sie dann echo ob_get_clean()
, erstellen Sie eine unzuverlässige Ausgabe. Das hängt damit zusammen, wie die Komprimierung zusammen mit der Ausgabepufferung funktioniert:
PHP puffert Teile der Ausgabe. Das bedeutet, PHP beginnt mit der Komprimierung der Ausgabe, behält aber einige Bytes, um die Komprimierung fortzusetzen. Also gibt ob_get_clean () den so weit komprimierten Teil des Puffers zurück. Oft ist dieses Ergebnis nicht vollständig.
Um damit fertig zu werden, leeren Sie zuerst den Puffer:
%Vor%Und stellen Sie sicher, dass Sie danach keine weiteren Ausgaben mehr haben.
Wenn PHP das Ende Ihres Skripts erreicht hätte, hätte es dafür gesorgt: Spülen und ausgeben.
Nun müssen Sie ob_flush()
manuell aufrufen, damit PHP den Puffer durch die Rückrufe explizit drückt.
Da Firefox einen Fehler zurückgibt, wird ein anderes Tool benötigt, um zu sehen, was den Kodierungsfehler verursacht. Sie können curl
verwenden, um zu verfolgen, was passiert:
Ruft die URL mit aktivierter Komprimierung ab, während alle Antwortheader und der unverschlüsselte Text angezeigt werden. Dies ist notwendig, da PHP die Komprimierung des ob_gzhandler
-Rückrufs basierend auf Anfrage-Headern transparent aktiviert / deaktiviert.
Eine Antwort zeigt auch, dass PHP auch die benötigten Antwortheader setzt. Sie müssen also nicht manuell angegeben werden. Das wäre sogar gefährlich, denn nur wenn man ob_start('ob_gzhandler')
aufruft, kann man nicht sagen, ob die Komprimierung aktiviert ist oder nicht.
Falls die Komprimierung unterbrochen wird, wird curl
eine Fehlerbeschreibung geben, aber den Körper nicht anzeigen.
Im folgenden wird eine solche curl-Fehlermeldung mit einer unvollständig generierten Ausgabe eines fehlerhaften PHP-Skripts provoziert:
%Vor% Wenn Sie den Schalter --raw
hinzufügen, können Sie sogar den rohen Antworttext anzeigen:
Das kann einen Eindruck vermitteln, was schief läuft, wie unkomprimierte Teile im Körper.
Tags und Links php gzip output-buffering