Heim >Backend-Entwicklung >PHP-Tutorial >Was Sie bei der Verwendung der PHP-Flush-Funktion beachten sollten

Was Sie bei der Verwendung der PHP-Flush-Funktion beachten sollten

高洛峰
高洛峰Original
2016-12-22 16:27:331226Durchsuche

Die ob_*-Funktionsreihe betreibt den Ausgabepuffer von PHP selbst

Ob_flush dient also dazu, den Puffer von PHP selbst zu aktualisieren

Und Flush ist genau genommen nur das Verfügbar, wenn PHP nur dann praktische Wirkung hat, wenn es als Apache-Modul (Handler oder Filter) installiert ist. Es aktualisiert den Puffer des Webservers (der speziell als Apache betrachtet werden kann). Mit dem Apache-Modul ruft Flush indirekt die Apache-API auf, indem es den Flush-Member-Funktionszeiger von sapi_module aufruft.
: ap_rflush aktualisiert den Ausgabepuffer von Apache. Natürlich heißt es im Handbuch auch, dass es möglicherweise einige andere Module von Apache gibt Das Ergebnis dieser Aktion ändern...

Einige Apache-Module, wie z. B. mod_gzip, können ihre eigene Ausgabe zwischenspeichern, was dazu führt, dass die von der Funktion „flush()“ generierten Ergebnisse nicht sofort an den Client-Browser gesendet werden .

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 werden sowohl Proxy_Buffering als auch (wenn Sie Nginx >= 1.5.6 haben) Fastcgi_Buffering eliminiert. Das Fastcgi-Bit ist entscheidend, wenn Sie PHP verwenden -fpm. Der Header lässt sich auch viel bequemer nach Bedarf ausführen.

Dokumente zu X-Accel-Buffering http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_buffering ;



Weitere Artikel zu den Vorsichtsmaßnahmen bei der Verwendung der PHP-Flush-Funktion finden Sie auf der chinesischen PHP-Website!
<?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)};
?>
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