La série de fonctions ob_* exploite le tampon de sortie de PHP lui-même
Ainsi, ob_flush actualise le tampon de PHP lui-même
Et flush, à proprement parler, n'est disponible que lorsque. PHP n'a d'effet pratique que lorsqu'il est installé en tant que module Apache (gestionnaire ou filtre).
Il rafraîchit le tampon du serveur Web (qui peut être considéré comme spécifiquement Apache
Sous la sapi d'Apache). module , flush appellera indirectement l'API d'Apache en appelant le pointeur de fonction membre flush de sapi_module,
: ap_rflush actualise le tampon de sortie d'Apache. Bien sûr, le manuel indique également qu'il existe d'autres modules d'Apache,
peut changer. résultat de cette action...
Certains modules Apache, tels que mod_gzip, peuvent mettre en cache leur propre sortie, ce qui empêchera les résultats générés par la fonction flush() d'être envoyés immédiatement au navigateur client.
Même le navigateur mettra en cache le contenu reçu avant de l'afficher. Par exemple, le navigateur Netscape met le contenu en cache jusqu'à ce qu'il reçoive une nouvelle ligne ou le début d'une balise HTML, et n'affiche pas l'intégralité du tableau tant qu'il n'a pas reçu la balise .
Certaines versions de Microsoft Internet Explorer
ne commenceront à afficher la page qu'après avoir reçu 256 octets, donc des espaces supplémentaires doivent être envoyés pour permettre à ces navigateurs d'afficher le contenu de la page.
Donc, l'ordre correct pour utiliser les deux est. D'abord ob_flush, puis flush,
Bien sûr, sous d'autres sapi, vous ne pouvez pas appeler flush, juste pour assurer la portabilité de votre code. Il est recommandé de l'utiliser ensemble
<?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)}; ?>
Si vous souhaitez prendre en charge nginx fpm php, vous devez ajouter un en-tête de réponse
header(' -Accel-Buffering: no');
Cela élimine à la fois proxy_buffering et (si vous avez nginx >= 1.5.6), fastcgi_buffering le bit fastcgi est crucial si vous utilisez php-fpm. L'en-tête est également beaucoup plus pratique à réaliser selon les besoins.
Documents sur 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)}; ?>