Heim > Artikel > Backend-Entwicklung > PHP-Ausgabesteuerung
Nachdem ich den Code kürzlich übermittelt hatte, stellte ich fest, dass Firephp in den Umgebungen anderer Leute ein anderes Problem hatte. Die Eingabeaufforderung lautete: „Header bereits gesendet ...“, was sich von dem letzten Mal unterschied, als der Nginx-Puffer überschritten wurde. Bei der Überprüfung des Nginx-Fehlerprotokolls wurden keine Fehler gefunden, und einige Schüler stellten fest, dass Apache dasselbe tat, und vermuteten, dass es sich um ein PHP-Problem handelte. Aber ich benutze auch Apache und es gibt kein Problem! Ich habe versehentlich eine Seite gefunden, auf der keine Fehlermeldung angezeigt wurde. Ich habe festgestellt, dass der Ausgabeinhalt der Seite etwa 1 KB groß war. Ich vermutete, dass PHP automatisch die Pufferdaten sendete, was dazu führte, dass nachfolgende Firephp fehlschlug Senden Sie Debugging-Informationen über den HTTP-Header und beenden Sie die Ausführung des PHP-Skripts.
Kommentieren Sie die Ausgabeanweisung nach dem Rendern der Vorlage aus und der Fehler wird nicht mehr angezeigt. Es wurde festgestellt, dass ein Problem mit der gepufferten Ausgabe von PHP vorliegt. Beim Vergleich von php.ini in verschiedenen Umgebungen habe ich festgestellt, dass die Werte von „output_buffering“ unterschiedlich sind. Mein Wert ist „On“, während andere den Standardwert „4096“ haben.
PHP-Code
Output buffering is a mechanism for controlling how much output data (excluding headers and cookies) PHP should keep internally before pushing that data to the client. If your application's output exceeds this setting, PHP will send that data in chunks of roughly the size you specify. Turning on this setting and managing its maximum buffer size can yield some interesting side-effects depending on your application and web server. You may be able to send headers and cookies after you've already sent output through print or echo. You also may see performance benefits if your server is emitting less packets due to buffered output versus PHP streaming the output as it gets it. On production servers, 4096 bytes is a good setting for performance reasons. Note: Output buffering can also be controlled via Output Buffering Control functions. Possible Values: On = Enabled and buffer is unlimited. (Use with caution) Off = Disabled Integer = Enables the buffer and sets its maximum size in bytes. Note: This directive is hardcoded to Off for the CLI SAPI Default Value: Off Development Value: 4096 Production Value: 4096 http://php.net/output-buffering output_buffering = On
Wenn laut der obigen Erklärung „output_buffering“ auf „On“ oder „4096“ gesetzt ist und wir in jeder Anfrage „echo“ oder „print“ verwenden, ist dies bei PHP nicht der Fall Gibt es tatsächlich sofort aus, speichert es aber zuerst im Puffer. Wenn es eine bestimmte Größe (z. B. 4 KB) erreicht oder die Skriptausführung endet, gibt es den Pufferinhalt an den Browser aus und löscht ihn.
Wenn das HTTP-Protokoll Inhalte überträgt, wird zuerst der Antwortheader übertragen. Sobald die Ausgabe des Inhalts beginnt, kann der Antwortheader nicht mehr geändert werden. Wenn „output_buffering“ aktiviert ist, speichert PHP die gesamte Ausgabe zwischen und wartet auf das Ende der Anforderung, bevor der Inhalt an den Browser ausgegeben wird. Daher gibt es immer noch kein Problem, wenn Firephp den HTTP-Antwortheader im letzten Moment ändert, da noch kein Inhalt vorhanden ist Ausgabe zu diesem Zeitpunkt: Wenn Output_buffering 4096 (oder ein anderer fester Wert) ist, wird der Inhalt jedes Mal, wenn er voll ist, an den Client ausgegeben und der Antwortheader kann nicht mehr ausgegeben werden Wenn Sie versuchen, den Header festzulegen, wird Folgendes angezeigt: „Header wurden bereits gesendet …“.
Die Steuerung der Pufferausgabe des Webservers kann zu einer besseren Benutzererfahrung führen, beispielsweise bei Facebook und Sinas Bigpipe.
Dieses Mal stellten wir fest, dass der HTTP-Antwortheader aufgrund der großen Menge an Debugging-Informationen auf den meisten Seiten groß war (viel größer als 4 KB, und einige erreichten 36 KB), daher die automatische Ausgabemechanismus. Lösung: Ändern Sie „output_buffering“ auf „On“; ändern Sie „output_buffering“ manuell auf einen größeren Wert;