Explication détaillée des malentendus liés à l'utilisation de la fonction de chasse d'eau

伊谢尔伦
Libérer: 2023-03-11 10:08:01
original
2017 Les gens l'ont consulté

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(&#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)};
?>
Copier après la connexion

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(&#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)};
?>
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal