Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Ausgabesteuerung

PHP-Ausgabesteuerung

巴扎黑
巴扎黑Original
2016-11-11 10:04:101135Durchsuche

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;


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn