Detaillierte Erläuterung der Verwendung der PHP-Ausgabecache-Funktion ob_start, Flush, ob_flush

伊谢尔伦
Freigeben: 2023-03-11 10:16:02
Original
1394 Leute haben es durchsucht

Beachten Sie, dass Sie die Apache-Servicezeile neu starten müssen, nachdem Sie php.ini geändert haben!

for($i=0;$i<10;$i++) {
  echo $i.&#39;<br />&#39;;
  flush();
  sleep(1);
}
Nach dem Login kopieren

Freunde, die etwas über die PHP-Cache-Ausgabesteuerungsfunktion erfahren haben, müssen mit dem oben genannten Code vertraut sein. Der gewünschte Effekt besteht darin, jede Sekunde eine Zahl auszugeben, was erforderlich ist Schließen Sie die gesamte Ausgabe 10 Sekunden lang ab, aber Sie werden seltsame Phänomene bei der tatsächlichen Ausführung feststellen. Bei manchen Leuten oder manchmal funktioniert es wie erwartet, während bei manchen Leuten oder manchmal nach 10 Sekunden 10 Zahlen auf einmal ausgegeben werden. Ein Freund hat mir immer gesagt, dass diese Situation oft darauf zurückzuführen ist, dass der IE-Cache 256 Zeichen erreichen muss, bevor er ausgegeben werden kann. Tatsächlich habe ich mir die Situation des IE auch schon einmal angesehen, aber manchmal funktioniert es immer noch Funktioniert nicht. Nachdem ich heute das Handbuch sorgfältig gelesen hatte, wurde mir klar, dass es Gründe für diese unvorhersehbaren Phänomene gibt.

Es stellt sich heraus, dass es in php.ini zwei Schlüsselparameter gibt, die sich auf die Cache-Ausgabesteuerung von PHP auswirken:

Parameter 1: Ausgabepufferung: Ein/Aus oder Ganzzahl. Wenn diese Option aktiviert ist, wird die Ausgabe-Cache-Steuerung in allen Skripten verwendet, ohne dass die Größe des Caches begrenzt wird. Bei einer Ganzzahl, wie etwa „output_buffering=4096“, wird der Cache automatisch aktualisiert, wenn die Cache-Daten 4096 Bytes erreichen. Der Unterschied in diesem Parameter ist der Grund, warum der obige Code zu unterschiedlichen Zeiten unterschiedliche Ausführungsergebnisse liefert. Wenn „output_buffering“ deaktiviert ist, werden alle Ausgaben (Echos) des Skripts sofort an den Client gesendet. Wenn der obige Code ausgeführt wird, wird jede Sekunde eine Zahl ausgegeben. Nachdem „output_buffering“ aktiviert wurde, wird der Ausgabeinhalt zunächst auf dem Server zwischengespeichert und erst am Ende des Skripts an den Client gesendet.

Parameter 2: implicit_flush: ein/aus. Die Einstellung „ON“ bedeutet, dass die Ausgabe des Skripts sofort automatisch an den Client gesendet wird. Dies entspricht dem automatischen Hinzufügen von „flush()“ nach dem Echo.

Verwandte Funktionen für die PHP-Cache-Ausgabesteuerung:

ob_start()

Erster Parameter: Rückruffunktion , optional. Die Ausgabe kann gefiltert oder anderweitig verarbeitet werden, bevor sie zwischengespeichert wird. Die häufigste Verwendung ist ob_start('ob_gzhandler'), wodurch die zwischengespeicherten Daten gzip-komprimiert werden, bevor sie an den Client gesendet werden.

Der zweite Parameter: die Größe des Cache-Blocks, optional. Wenn der zwischengespeicherte Inhalt die Cache-Blockgröße erreicht oder manipuliert, wird der Cache automatisch gelöscht. Der Standardwert ist 0, was bedeutet, dass die Größe nicht begrenzt ist und der Cache bis zum Ende zwischengespeichert wird. Es gibt auch einen Sonderwert 1, der chunk_size=4096 darstellt.

Der dritte Parameter: ob der Cache geleert werden soll, optional, der Standardwert ist „true“, wenn er auf „false“ gesetzt ist, wird der Cache nicht geleert, bevor die Skriptausführung endet.

Sie können ob_get_contents() verwenden, um die vom Server zwischengespeicherten Daten in Form einer Zeichenfolge abzurufen, und ob_end_flush() verwenden um die zwischengespeicherten Ausgabedaten abzurufen und das Caching zu deaktivieren.

Mit ob_end_clean() werden die auf dem Server zwischengespeicherten Daten stillschweigend gelöscht, ohne dass Daten oder andere Aktionen erforderlich sind.

Die serverseitigen Caches sind gestapelt, was bedeutet, dass Sie nach der Aktivierung von ob_start() und vor dem Schließen einen weiteren Cache ob_start() darin öffnen können. Sie müssen jedoch auch sicherstellen, dass es genauso viele Vorgänge zum Deaktivieren des Caches wie Vorgänge zum Aktivieren des Caches gibt.

ob_start() kann eine Rückruffunktion zum Verarbeiten zwischengespeicherter Daten angeben. Wenn ein ob_start() in einem anderen

ob_start() verschachtelt ist, gehen wir davon aus, dass der äußere Die Nummer von ob_start() der Ebene ist A und die Nummer von ob_start() der inneren Ebene ist B. Sie haben jeweils eine Rückruffunktion namens functionA und functionB. Wenn die Daten im Cache B ausgegeben werden, werden sie verarbeitet von der FunktionB-Rückruffunktion und dann zur Verarbeitung an die äußere FunktionA-Rückruffunktion übergeben und dann an den Client ausgegeben werden.

Darüber hinaus heißt es im Handbuch, dass bei einigen Webservern, wie z. B. Apache, die Verwendung der Rückruffunktion das aktuelle Arbeitsverzeichnis des Programms ändern kann. Die Lösung besteht darin, das Programm manuell zu ändern Verwenden Sie in der Rückruffunktion die Funktion chdir. Denken Sie daran, das Handbuch zu lesen, wenn Sie darauf stoßen.

flush() und ob_flush()

Die Verwendung dieser beiden Funktionen ist für viele Menschen wahrscheinlich das verwirrendste Thema. Die Erklärung der beiden Funktionen im Handbuch Die Sprache ist ebenfalls unklar und der Unterschied zwischen ihnen wird nicht klar hervorgehoben. Es scheint, dass die Funktion beider darin besteht, den Ausgabecache zu aktualisieren. Wenn jedoch im Code am Anfang unseres Artikels „flush()“ durch „ob_flush()“ ersetzt wird, wird das Programm nicht mehr korrekt ausgeführt. Offensichtlich gibt es einen Unterschied zwischen ihnen. Andernfalls würde es ausreichen, im Handbuch direkt anzugeben, dass es sich bei einer davon um einen Alias ​​einer anderen Funktion handelt. Was ist also der Unterschied zwischen ihnen?

反复研究了手册的说明,参考了手册中一些人的留言,自己琢磨应该是这样的:

在没有开启缓存时,脚本输出的内容都在服务器端处于等待输出的状态,flush()可以将等待输出的内容立即发送到客户端。

开启缓存后,脚本输出的内容存入了输出缓存中,这时没有处于等待输出状态的内容,你直接使用flush()不会向客户端发出任何内容。而ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端,这时你就需要先使用ob_flush()再使用flush(),客户端才能立即获得脚本的输出。

也就是说本文开头的脚本,可以根据缓存开启与否,有如下几种不同的写法:

注:以下代码都未考虑IE缓存必须大于256字节才输出的问题,如在IE下测试,请在代码开始加一句:“echo str_repeat('',256)”

写法1:

output_buffering = off
implicit_flush=off
 
for($i=0;$i<10;$i++) {
  echo $i.&#39;<br />&#39;;
  flush();
  sleep(1);
}
Nach dem Login kopieren

写法2:

output_buffering = on
implicit_flush=off
 
for($i=0;$i<10;$i++) {
  echo $i.&#39;<br />&#39;;
  ob_flush();
  flush();
  sleep(1);
}
Nach dem Login kopieren

写法3:

output_buffering = off
implicit_flush=off
 
ob_start();
for($i=0;$i<10;$i++) {
  echo $i.&#39;<br />&#39;;
  ob_flush();
  flush();
  sleep(1);
}
Nach dem Login kopieren

写法4:

output_buffering = on
implicit_flush=off
 
ob_end_flush();
for($i=0;$i<10;$i++) {
  echo $i.&#39;<br />&#39;;
  flush();
  sleep(1);
}
Nach dem Login kopieren

写法5:

output_buffering = on
implicit_flush=off
 
ob_end_clean();
for($i=0;$i<10;$i++) {
  echo $i.&#39;<br />&#39;;
  flush();
  sleep(1);
}
Nach dem Login kopieren

写法6:

output_buffering = on;
implicit_flush=on
 
ob_end_clean();
// 或者ob_end_flush();
for($i=0;$i<10;$i++) {
  echo $i.&#39;<br />&#39;;
  sleep(1);
}
Nach dem Login kopieren

写法7:

output_buffering = on;
implicit_flush=on
 
ob_end_clean();
// 或者ob_end_flush();
for($i=0;$i<10;$i++) {
  echo $i.&#39;<br />&#39;;
  flush();
  sleep(1);
}
Nach dem Login kopieren

写法8:

output_buffering = off
implicit_flush=on
 
for($i=0;$i<10;$i++) {
  echo $i.&#39;<br />&#39;;
  sleep(1);
}
Nach dem Login kopieren

 

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung der PHP-Ausgabecache-Funktion ob_start, Flush, ob_flush. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!