Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung von Missverständnissen bei der Verwendung der Flush-Funktion

Ausführliche Erläuterung von Missverständnissen bei der Verwendung der Flush-Funktion

伊谢尔伦
伊谢尔伦Original
2017-06-24 11:26:352018Durchsuche

ob_flush/flush wird im Handbuch so beschrieben, dass beide den Ausgabepuffer leeren und dass sie zusammen verwendet werden müssen, was bei vielen Menschen zu Verwirrung führen wird ... Tatsächlich ist ihre Operation ein Objekt sind unterschiedlich, und in einigen Fällen führt Flush überhaupt nichts aus

Funktionen der ob_*-Reihe betreiben den Ausgabepuffer von PHP selbst.

Ob_flush aktualisiert also PHPs eigenen Puffer.

Und Flush hat streng genommen nur praktische Auswirkungen, wenn PHP als Apache-Modul (Handler oder Filter) installiert ist.
Es aktualisiert den Puffer des WebServers (kann speziell als Apache betrachtet werden).

Unter dem Sapi des Apache-Moduls, Flush ruft indirekt die API von Apache auf, indem es das Flush-Mitglied von sapi_module Funktionszeiger aufruft,
: ap_rflush aktualisiert natürlich auch den Ausgabepuffer von Apache , es gibt einige andere Module von Apache,
kann das Ergebnis dieser Aktion ändern.

Einige Module von Apache, wie z. B. mod_gzip, führen möglicherweise selbst Ausgabe-Caching durch, was dazu führt, dass „flush()“ Funktion zum Generieren Die Ergebnisse werden nicht sofort an den Client-Browser gesendet.

Sogar der Browser speichert den empfangenen Inhalt zwischen, bevor er ihn anzeigt. Beispielsweise speichert der Netscape-Browser Inhalte zwischen, bis er eine neue Zeile oder den Anfang eines HTML-Tags empfängt, und zeigt die gesamte Tabelle erst an, wenn er das -Tag empfängt.

Einige Versionen von Microsoft Internet Explorer
beginnen mit der Anzeige der Seite erst nach dem Empfang von 256 Bytes, daher müssen einige zusätzliche Leerzeichen gesendet werden, damit diese Browser den Seiteninhalt anzeigen können.

Die richtige Reihenfolge für die Verwendung der beiden ist also: Zuerst ob_flush, dann Flush.

Natürlich können Sie unter anderen Sapi nicht Flush aufrufen, nur um die Portabilität Ihres Codes sicherzustellen Es wird empfohlen, es zusammen zu verwenden.

<?php
// set_time_limit(0);
header(&#39;Content-Type: text/event-stream&#39;);
header(&#39;Cache-Control: no-cache&#39;);
// ob_end_flush();
// ini_set(&#39;output_buffering&#39;, 0);
// ini_set(&#39;implicit_flush&#39;, 1);
if (ob_get_level() == 0) ob_start();
echo str_repeat(&#39; &#39; ,4096);
$long = 60;
while($long > 0)
{
$time = date(&#39;r&#39;);
echo "data: The server time is: {$time}\n\n";
ob_flush();
flush();//break;
sleep(1);
$long --;
}
// var source=new EventSource("http://localhost:18000/sse.php");source.onmessage=function(event){console.info(event.data)};
?>

Wenn Sie Nginx + FPM + PHP unterstützen möchten, müssen Sie einen Antwortheader hinzufügen

header('X-Accel-Buffering: no');
Dadurch entfällt sowohl Proxy_Buffering als auch (wenn Sie Nginx >= 1.5.6 haben) Fastcgi_Buffering. Das Fastcgi-Bit ist entscheidend, wenn Sie PHP-FPM verwenden nach Bedarf.
Dokumente zu X-Accel-Buffering http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_buffering ;

<?php
// set_time_limit(0);
header(&#39;Content-Type: text/event-stream&#39;);
header(&#39;Cache-Control: no-cache&#39;);
header(&#39;X-Accel-Buffering: no&#39;);

// ob_end_flush();
// ini_set(&#39;output_buffering&#39;, 0);
// ini_set(&#39;implicit_flush&#39;, 1);

// if (ob_get_level() == 0) ob_start();
// echo str_repeat(&#39; &#39; ,4096);

$long = 60;
while($long > 0)
{
	$time = date(&#39;r&#39;);
	echo "data: The server time is: {$time}\n\n";
	ob_flush();
	
	flush();//break;
	sleep(1);
	$long --;
}
// var source=new EventSource("http://localhost:18000/sse.php");source.onmessage=function(event){console.info(event.data)};
?>

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Missverständnissen bei der Verwendung der Flush-Funktion. 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