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?

15
demandé sur Leagsaidh Gordon 2012-08-28 23:04:19

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');
21
répondu mad 2014-07-29 14:04:49

solution facile:

fastcgi_keep_conn on; # < solution

proxy_buffering off;
gzip off;
4
répondu Ondrej Prochazka 2012-11-30 09:28:43

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.

2
répondu Redzarf 2013-06-27 10:13:36

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!)

0
répondu Parallelis 2012-08-28 19:20:42