2010-08-14 3 views
0

Je pensais que flush(); fonctionnerait, au moins de ce que Google/Stackoverflow me disent, mais sur mon système Windows WAMP (Windows, Apache, MySQL, PHP) cela ne fonctionne pas.PHP rinçage sortie dès que vous appelez echo

Y at-il un paramètre PHP que je dois définir pour faire fonctionner flush()?

Voici mon code:

<?php 
echo "Fun"; 

flush(); 

sleep(5); 

echo "<br>Mo"; 
?> 

Le code produit juste tous ensemble lorsque le script est fait exécuter (au bout de 5 secondes) .. Je ne veux pas, je veux « Fun » de se montrer à droite loin, puis après 5 secondes 'Mo'.

J'ai essayé d'autres combinaisons de flush comme ob_end_flush();or ob_implicit_flush(true); mais rien ne fonctionne. Des idées?

+0

Avez-vous vérifié php.ini de implicit_flush? – stillstanding

+0

@stillstanding, Oui, j'ai activé ce paramètre et j'ai aussi essayé de configurer 'ini_set ('implicit_flush', true),' ... ne fonctionne toujours pas ... je commence à penser que ça a quelque chose à voir avec un bug sur les fenêtres. –

+0

zlib.output_compression activera également la mise en mémoire tampon si elle est activée. – stillstanding

Répondre

5

Le script fonctionne très bien de CLI, l'affichage "Fun", attendre 5 secondes avant d'afficher "<br> Mo".

Pour un navigateur les résultats pourraient être un peu différent parce que:

  1. Le navigateur ne commencera pas rendu tout de suite. Obtenir 3 octets de données pour un document HTML n'est pas suffisant pour faire quoi que ce soit, il est donc probable qu'il en attende encore plus.
  2. La mise en mémoire tampon des E/S implicites au niveau de la bibliothèque sera probablement active jusqu'à la réception d'une nouvelle ligne.

Pour contourner 1) utiliser du texte/type de contenu brut pour votre test; 2) a besoin de nouvelles lignes, alors faites un echo "Fun\n"; et echo "<br>Mo\n"; Bien sûr, vous n'utiliserez pas de texte/plain pour les données HTML réelles.

+0

Ouais, j'aime votre réponse. Peut également être côté client. :-) – Savageman

+0

Vous avez raison ... J'ai utilisé Chrome pendant tout ce temps et ça ne fonctionnait pas. Essayer mon premier exemple (même sans newlines et sortie texte/plan) sur Firefox a bien fonctionné ... Je me demande s'il y a un moyen de faire fonctionner ce cross-browser ... +1 mais vous voudrez peut-être sortir le \ n et texte/trucs simples. –

0

Vérifiez votre php.ini pour output_buffering.

+0

output_buffering = Sur <- c'est ce que j'ai. –

+0

réglez le sur Off, il peut résoudre votre problème – tamasd

0

Peut-être que le problème est ici Apache, ce qui peut aussi avoir des tampons ...

3

Si vous utilisez CGI/FastCGI, oubliez-le! Ceux-ci n'implémentent pas le flush. Le serveur Web peut avoir son propre tampon.

Vous pouvez désactiver tous en mémoire tampon de sortie en PHP avec la commande suivante:

ob_implicit_flush(); 
1

Si le problème persiste, même si vous définissez explicitement

implicit_flush = yes 

dans votre php.ini, vous pouvez également ensemble

output_buffering = off 

qui a fait l'affaire dans mon cas (après avoir tiré mes cheveux pendant 4 + heures)

+0

Veuillez noter que la syntaxe est incorrecte. –

7

est donc ce que j'ai découvert:

Flush ne fonctionnerait pas sous le mod_gzip d'Apache ou de gzip Nginx parce que, logiquement, il est gzipping le contenu, et pour ce faire, il doit tampon contenu gzipper. N'importe quel genre de gzipping de serveur Web affecterait ceci. En bref, côté serveur, nous devons désactiver gzip et diminuer la taille du buffer fastcgi.Alors:

  • En php.ini:

    . output_buffering = Off

    . zlib.output_compression = Off

  • En nginx.conf:

    . gzip éteint;

    . proxy_buffering off;

ont aussi cette ligne à portée de main, surtout si vous n'avez pas accès à php.ini:

  • @ini_set ('zlib.output_compression', 0);

  • @ini_set ('implicit_flush', 1);

  • @ob_end_clean();

  • set_time_limit (0);

Enfin, si vous l'avez, coment le code ci-dessous:

  • ob_start ('ob_gzhandler');

  • ob_flush();

code de test PHP:

ob_implicit_flush(1); 

for($i=0; $i<10; $i++){ 
    echo $i; 

    //this is for the buffer achieve the minimum size in order to flush data 
    echo str_repeat(' ',1024*64); 

    sleep(1); 
}