Comment désactiver le tampon de sortie dans Nginx pour une application PHP
nous avons un code similaire à celui-ci:
<?php
ob_implicit_flush(true);
ob_end_flush();
foreach ($arrayOfStrings as $string) {
echo time_expensive_function($string);
}
?>
dans Apache, cela enverrait chaque écho au navigateur tel qu'il est sorti. Dans nginx / FastCGI cependant, cela ne fonctionne pas à cause de la façon dont nginx fonctionne (par défaut).
est-il possible de faire ce travail sur nginx/FastCGI, et si oui, comment?
5 réponses
aucune des solutions ci-dessus n'a fonctionné pour moi.
d'abord php doit tout vider correctement:
@ob_end_flush();
@flush();
puis, j'ai trouvé deux solutions de travail:
1) Via NGINX configuration:
fastcgi_buffering off;
2) via l'en-tête HTTP dans le code php
header('X-Accel-Buffering: no');
solution facile:
fastcgi_keep_conn on; # < solution
proxy_buffering off;
gzip off;
je ne voulais pas avoir à éteindre gzip pour l'ensemble du serveur ou un répertoire entier, juste pour quelques scripts, dans quelques cas spécifiques.
Tout ce dont vous avez besoin est ceci avant que quelque chose ne se répète:
header('Content-Encoding: none;');
puis faire la chasse d'eau comme d'habitude:
ob_end_flush();
flush();
NGINX semble s'apercevoir que l'encodage a été désactivé et qu'il n'est pas gzip.
ajouter la fonction flush () dans votre boucle:
foreach ($arrayOfStrings as $string) {
echo time_expensive_function($string);
flush();
}
cela pourrait fonctionner, mais pas nécessairement à chaque itération (il y a de la magie en jeu!)
ajouter le-flush à la configuration FastCGI, se référer au manuel:
-
http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiServer
-
http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiConfig
-
http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiExternalServer
de http://mailman.fastcgi.com/pipermail/fastcgi-developers/2009-July/000286.html