ob_flush/flush est décrit dans le manuel comme vidant à la fois le tampon de sortie et doit être utilisé conjointement, donc cela confond beaucoup de gens... En fait, les deux opérations sont différentes dans certaines. Dans certains cas, flush ne fait rien du tout
Les fonctions de la série ob_* exploitent le tampon de sortie de PHP lui-même.
Ainsi, ob_flush actualise le propre tampon de PHP.
Et flush, à proprement parler , cela n'a d'effet pratique que lorsque PHP est installé en tant que module Apache (gestionnaire ou filtre).
Il rafraîchit le tampon du serveur Web (peut être considéré comme spécifiquement Apache).
Sous la sapi du module Apache, videz appellera indirectement l'API d'Apache en appelant le membre flush de sapi_module pointeur de fonction ,
: ap_rflush rafraîchit le tampon de sortie d'Apache. Bien sûr, le manuel également Cela dit, il existe d'autres modules. d'Apache,
peut modifier le résultat de cette action..
Certains modules d'Apache, tels que mod_gzip, peuvent effectuer eux-mêmes la mise en cache de sortie, ce qui entraînera la génération de la fonction flush(). Les résultats sont pas envoyé 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('X-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 à faire. 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)}; ?>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!