Heim > Artikel > Backend-Entwicklung > Was Sie bei der Verwendung der PHP-Flush-Funktion beachten sollten
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('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); // ob_end_flush(); // ini_set('output_buffering', 0); // ini_set('implicit_flush', 1); if (ob_get_level() == 0) ob_start(); echo str_repeat(' ' ,4096); $long = 60; while($long > 0) { $time = date('r'); 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 ;
<?php // set_time_limit(0); header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); header('X-Accel-Buffering: no'); // ob_end_flush(); // ini_set('output_buffering', 0); // ini_set('implicit_flush', 1); // if (ob_get_level() == 0) ob_start(); // echo str_repeat(' ' ,4096); $long = 60; while($long > 0) { $time = date('r'); 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)}; ?>