Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Puffer

PHP-Puffer

不言
不言Original
2018-05-15 17:46:433115Durchsuche

Dieser Artikel stellt das Wissen über PHP-Puffer vor und gebe einen Hinweis an Freunde, die einen Blick darauf werfen

Was? 🎜> Einfach ausgedrückt besteht die Funktion eines Puffers darin, den Eingabe- oder Ausgabeinhalt zuerst in den Speicher zu legen, ohne ihn anzuzeigen oder zu lesen. Die Frage, warum es einen Puffer gibt, ist eine sehr weit gefasste Frage

Tatsächlich besteht die wichtigste Rolle des Puffers darin, den Betrieb einer Hochgeschwindigkeits-CPU und relativ langsamer E/A-Geräte (Festplatten usw.) zu koordinieren.

Wenn Sie den Puffer von PHP verstehen möchten, müssen Sie wissen, wo der Puffer beim Ausführen von PHP festgelegt ist.

Wenn Sie beim Ausführen von PHP auf Code stoßen, der Daten ausgibt, z. B. echo print_r, legt PHP die auszugebenden Daten in den eigenen Puffer von PHP und wartet auf die Ausgabe.

Wenn PHPs eigener Puffer empfängt Eine Anweisung, den Inhalt des Puffers auszugeben, gibt die Daten im Puffer an Apache aus, empfängt die von PHP ausgegebenen Daten und speichert die Daten dann im Apache selbst. Warten Sie, bis die Ausgabe erfolgt

Wenn Apache die Anweisung empfängt und nur den Inhalt des Puffers ausgeben möchte, gibt er den Inhalt des Puffers aus und gibt ihn an den Browser zurück. Es ist ersichtlich, dass PHP die Daten zur Zeit ausgeben möchte und dabei zwei Puffer durchläuft (. zuerst sein eigenes, dann das von Apache) und dann zum Browser zurückkehren.

Welche Rolle spielt der Puffer in PHP?1 wurde vor der Verwendung der Header-Funktion ausgegeben, was zu bestimmten Fehlern führt, z. B. Header-Informationen können nicht geändert werden – Header wurden bereits gesendet von;

1

2

1

2


echo "this is test";

header("LOCATION http://www.baidu.com");

echo "das ist test";

header("LOCATION http://www.baidu.com");


Der Grund für diesen Fehler ist, dass einige Daten vor dem Header ausgegeben wurden und Apache während der Ausgabe dieser Daten gleichzeitig einen Antwortstatus an den Browser sendet (da eine Ausgabe erfolgt, ist diese Anfrage gültig). und dann verwenden Sie die Header-Funktion
erneut, um den HTTP-Header zu senden. Der Fehler bedeutet: Der HTTP-Header wurde gesendet und Sie können ihn nicht ändern.
Warum kann dieser Fehler vermieden werden? ?
Da die Header-Funktion nicht vom Puffer beeinflusst wird, führt PHP sofort Apache aus, um diesen HTTP-Header an den Browser zu senden Daten werden im Puffer gespeichert und warten auf die Ausgabe. Dies kann die Fehler vermeiden, die zuvor aufgetreten sind.
2. Beim Schreiben von Dateien und beim Herunterladen von Programmen über PHP.
Um das Herunterladen von Dateien sicherer zu machen und die Kontrollierbarkeit zu verbessern, Viele Freunde verwenden gerne PHP, um Datei-Download-Seiten zu schreiben. Das Prinzip ist sehr einfach: Lesen und Anzeigen des Dateiinhalts über fwrite und anschließendes Senden des HTTP-Headers über den Header. Lassen Sie den Browser wissen, dass es sich um einen Anhang handelt dass
den Effekt der Bereitstellung von Downloads erzielen kann
Wenn Sie die oben beschriebene Methode zum Bereitstellen einer Download-Seite verwenden, treten Effizienzprobleme auf. Wenn eine Datei groß ist, gehen Sie davon aus, dass sie 100 MB groß ist Pufferausgabe: Alle 100 Millionen Daten müssen ausgelesen und dann auf einmal an die Seite zurückgegeben werden. Wenn dies geschieht, erhält der Benutzer keine Antwort, bis alle Daten gelesen sind
, was die Benutzererfahrung verbessert 🎜> Wenn der Ausgabepuffer aktiviert ist und das PHP-Programm einen bestimmten Abschnitt der Datei gelesen hat, gibt es ihn sofort an Apache aus und lässt Apache dann sofort zum Browser zurückkehren, was die Wartezeit des Benutzers verkürzen kann Was folgt: Was tun mit den Daten? Wir können eine While-Schleife schreiben, um die Datei Abschnitt für Abschnitt zu lesen.
Jedes Mal, wenn ein Abschnitt gelesen wird, wird dieser sofort ausgegeben, bis die gesamte Datei ausgegeben ist, sodass der Browser fortfahren kann Um Daten zu empfangen, müssen Sie nicht warten, bis alle Dateien gelesen sind.

Darüber hinaus löst dieser Ansatz auch ein weiteres sehr ernstes Problem, wenn beispielsweise eine Datei 100 MB groß ist und der Puffer nicht aktiviert ist Wenn das PHP-Programm jedoch ein Speicherlimit hat, legt der Administrator normalerweise ein Limit für die PHP-Ausführung fest 🎜> Speicher (durch das Gesamtspeicherlimit von php.ini, das standardmäßig auf 8 MB eingestellt ist), d Wenn die Datei 100 MB groß ist, reicht der Speicher zum Lesen nicht aus. Dieses Mal müssen wir die oben beschriebene

-Methode verwenden, um dieses Problem zu lösen, um Speicherbeschränkungen zu vermeiden 🎜> 3. Statischer Dateicache

Viele Unternehmen verfügen mittlerweile über einen solchen. Die Anforderung besteht darin, dass beim ersten Besuch einer bestimmten Seite PHP ausgeführt wird und der angezeigte Inhalt dann an den Browser zurückgegeben wird Gleichzeitig muss der angezeigte Inhalt auf dem Server gespeichert werden, damit er beim nächsten Besuch direkt angezeigt wird. Zeigen Sie die auf dem Server gespeicherten Dateien direkt an, ohne sie über PHP bedienen zu müssen.
Dies ist der Sogenannter „statischer Seitencache“. Wie können wir also den Inhalt an den Browser zurückgeben und gleichzeitig die Daten auf dem Server speichern? "0">

1

2

3

4

5

6

1

2

3

4

5

6


ob_start();

echo 'aaa';

$string = ob_get_contents();

file_put_contents('a.html', $string);

ob_flush();

flush();

ob_start();

echo 'aaa';

$string = ob_get_contents();

file_put_contents('a.html', $string);

ob_flush();

flush();

table>


Konfiguration im Zusammenhang mit dem Ausgabepuffer

In PHP.INI gibt es zwei Konfigurationselemente, die eng mit dem Puffer verknüpft sind
1.output_buffering
Diese Konfiguration Es wirkt sich direkt aus der Puffer von PHP selbst, und es gibt drei Konfigurationsparameter on/off/xK (x ist ein ganzzahliger Wert);
on – öffne den Puffer
off – schließe den Puffer
256k – Einschalten Puffer, und wenn der Inhalt des Puffers 256 KB überschreitet, wird der Puffer automatisch aktualisiert (senden von Daten an Apache);

2. Diese Konfiguration wirkt sich direkt auf den Apache-Puffer aus. Es gibt 2 Konfigurationsparameter . ein/aus
ein – Apache-Puffer automatisch aktualisieren, d. h. wenn PHP Daten an den Apache-Puffer sendet, muss es nicht auf andere Anweisungen warten und gibt die Ausgabe direkt an den Browser zurück
aus – tun Warten Sie nach dem Empfang der Daten nicht automatisch auf den Aktualisierungsbefehl
Pufferbezogene Funktionen
1 ob_implicit_flush
Die Funktion ist dieselbe wie implicit_flush Der automatische Flush-Apache-Puffer
2.flush
besteht darin, Anweisungen an Apache zu senden, damit Apache seinen eigenen Ausgabepuffer aktualisiert
3.ob_start
Öffnen Sie den Ausgabepuffer, unabhängig von der php.ini-Datei Zum Konfigurieren wird bei Verwendung dieser Funktion der Ausgabepuffer geöffnet, auch wenn „output_buffering“ auf „off“ gesetzt ist.
Die ob_start-Funktion akzeptiert auch einen Parameter, bei dem es sich um einen Rückruf einer Funktion handelt, d. h. vor der Eingabe des Pufferinhalts , Sie müssen die übergebenen Parameter aufrufen, um den Inhalt des Puffers einmal zu verarbeiten und ihn dann in den Puffer zu legen
4.ob_flush
weist PHP selbst an, seinen eigenen Puffer zu aktualisieren und die Daten an Apache zu senden
5.ob_clean
Löschen Sie den Inhalt des PHP-Puffers
6.ob_end_clean
Löschen Sie den Inhalt des PHP-Puffers und schließen Sie den Ausgabepuffer
7.ob_end_flush
Senden Sie den Inhalt von PHPs eigenem Puffer an Apache senden und den Inhalt seines eigenen Puffers löschen
8.ob_get_clean
Nachdem Sie den Inhalt des Puffers erhalten haben, löschen Sie den Puffer.
9.ob_get_contents
Rufen Sie den Inhalt des Ausgabepuffers ab
10.ob_get_flush
Den Inhalt im Puffer abrufen und an Apache senden
11.ob_get_length
Die Länge des Inhalts im Puffer abrufen
12.ob_list_handlers
Beim Ausführen abrufen ob_start, Der Name der zurückgerufenen Funktion, zum Beispiel:
ob_start('ob_gzhandler');
print_r(ob_list_handlers);
druckt ob_gzhandler;
13.ob_gzhandler
Diese Funktion Funktionen wie ob_start Der Callback-Parameter ruft diese Funktion auf, um eine GZIP- oder Deflate-Komprimierung für die Daten durchzuführen.

Verwendung von pufferbezogenem Inhalt 1. Die Reihenfolgebeziehung zwischen ob_flush und Flush. Aus der obigen Analyse geht hervor, dass ob_flush mit PHP selbst zusammenhängt, während wir diese beiden Funktionen verwenden um sie zuerst auszuführen. ob_flush,
und dann Flush ausführen, da wir die Daten zuerst von PHP an Apache senden und sie dann von Apache an den Browser zurücksenden müssen, wenn PHP die Daten nicht aktualisiert hat wird aufgerufen, Apache wird nichts haben Die Daten werden an den Browser zurückgegeben

2. Einige Browser zeigen die Daten nicht an, wenn sie zu wenige Zeichen empfangen, z. B. die alte Version von IE (sie müssen größer sein als 256k werden angezeigt. Offensichtlich wird der Puffer sowohl in PHP als auch in Apache aktualisiert, aber der Browser zeigt möglicherweise nicht die gewünschten Daten an Fügen Sie danach mehrere Leerzeichen hinzu, um sicherzustellen, dass der Browser keine derartigen seltsamen Probleme verursacht.

3 Einige Webserver haben einige Einschränkungen für ihre eigenen Ausgabepuffer, z Konfiguration fastcgi_buffer_size 4k, was bedeutet, dass es aktualisiert wird, wenn der Inhalt seines eigenen Ausgabepuffers 4K erreicht. Um die Daten des Inhalts sicherzustellen, können Sie den folgenden Code hinzufügen, um die Inhaltslänge

1

2

1

2

3

4

5


<?php

echo str_repeat(" ",4096);

?>

3

4

5

<?php<🎜>

<🎜>

echo</ code> <code class="php Functions">str_repeat(" " ,4096);<🎜>

<🎜>

? >


4. Wenn Sie das Komprimierungsmodul von mod_gzip aktivieren, kann dies dazu führen, dass Ihre Flush-Funktion nicht aktualisiert wird. Der Grund dafür ist, dass mod_gzip über einen eigenen Ausgabepuffer verfügt, der Apache anweist um den Ausgabepuffer zu aktualisieren, aber wenn der Inhalt komprimiert werden muss, gibt Apache den Inhalt an sein eigenes mod_gzip-Modul aus und gibt ihn nicht sofort aus, sodass der Inhalt nicht sofort ausgegeben werden kann Zur Verbesserung In diesem Fall können Sie das Modul mod_gzip deaktivieren oder den folgenden Inhalt zu httpd.conf hinzufügen, um die Komprimierung zu deaktivieren

1

1


SetEnv no-gzip dont-vary


SetEnv no-gzip dont-vary

tr>

Verwandte Empfehlungen:

Detaillierte Erklärung zur Beschleunigung Ihrer Website durch Aktualisierung des PHP-Puffers

Was ist ein PHP-Puffer?

Das obige ist der detaillierte Inhalt vonPHP-Puffer. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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