PHP-Ausgabepufferung, Inhaltscodierungsfehler verursacht durch ob_gzhandler?

8

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%     
tjm 19.06.2011, 14:04
quelle

2 Antworten

14

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.

Verwenden von ob_gzhandler und manuelles Echo des Puffers

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.

Untersuchung von HTTP-Komprimierungsproblemen mit Curl

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:

%Vor%

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:

%Vor%

Das kann einen Eindruck vermitteln, was schief läuft, wie unkomprimierte Teile im Körper.

    
hakre 19.06.2011, 15:21
quelle
0

Das macht phpharo:

%Vor%     
Mohammed Al Ashaal 04.11.2013 10:57
quelle

Tags und Links