Maison > développement back-end > tutoriel php > Points à noter lors de l'utilisation de la fonction PHP Flush

Points à noter lors de l'utilisation de la fonction PHP Flush

高洛峰
Libérer: 2023-03-04 06:38:01
original
1230 Les gens l'ont consulté

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(&#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(' -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(&#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
Pour plus d'articles liés aux précautions d'utilisation de la fonction PHP flush, veuillez faire attention au site Web PHP 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