2010-03-01 6 views
2

J'ai sommeil (n) dans une boucle qui est destinée à produire une sortie sur un cycle périodique.À la fin de mon sommeil()

Mais lorsque je lance la boucle, il ne se passe rien tant que toutes les secondes de la durée prévue de la boucle ne sont pas cumulées, après quoi toute la sortie se produit immédiatement.

Aide. Merci.

+8

Pouvez-vous poster le code en question? –

+4

Utilisez-vous le tampon de sortie? –

+0

J'ai lu cette question et pensé - moi aussi, je suis un insomniaque. Sur une note sérieuse, du code pourrait nous aider à voir ce qui se passe. –

Répondre

4

Peut-être que vous avez besoin de vider() le tampon de sortie après chaque sortie?

+0

D'accord, à chaque fois que vous envoyez une sortie echo/print, appelez 'flush()' immédiatement après. –

+0

Merci à vous deux. J'ai une autre question à cette fin (s'il vous plaît voir ci-dessous): – user225626

-1

Il semble que vous devriez utiliser flush() au lieu de sleep().

http://us3.php.net/manual/en/function.flush.php

+0

... ou les deux en conjonction? – Matchu

+0

Après un examen plus approfondi, il devrait être les deux en conjonction. Je pensais que l'utilisateur voulait vider la sortie vers le navigateur à chaque itération sans délai. La question initiale n'est pas complètement claire. – simeonwillbanks

7

essayer:

ob_end_flush(); // just in case 
while (1) { 
    echo 'wait for it<br/>'.PHP_EOL; 
    flush(); 
    sleep (2); 
} 
+0

mathroc, merci pour cela. Mais mon hôte partagé lance une erreur fatale: Appel à une fonction indéfinie: ob_flush_end() " Qu'est-ce que cela signifie? – user225626

+3

cela signifie que j'avais tort, le nom de la fonction est ob_end_flush – Mathieu

+0

S'il vous plaît voir mon nouveau commentaire ci-dessous. – user225626

1

Argh, le site est ne pas me laisser ajouter un commentaire à la dernière de mathroc. Donc, je vais le mettre ici:

Cela n'a pas fonctionné pour moi. Mais ce qui suit est vraiment bizarre: je accidentellement tombé sur un autre code de sommeil sur le web que je coincé devant ce que j'ai:

<HTML> 
<BODY> 

$c=0; 
while($c <$chunks){ 
$rand = rand(2000000, 6000000); 
echo '<br> . . . sleeping for ' . round(($rand/1000000),2) . ' seconds . . . zzzzzzzzzzzzzz<br>'; 
flush(); 
usleep($rand); 
$c++; 
} 

WHAT I'VE GOT BEGINS HERE: 
<br /> 
<br /> 
This page is loading.<br /> 
<?php 
for($i=0;$i<5;$i++){ 
flush(); sleep(2); 
?> 
Almost there...<br /> 
<?php 
} 
?> 
<?php flush(); sleep(2); ?> 
Done.<br /> 

</BODY> 
</HTML> 

... et maintenant le bloc inférieur code sommeils bien, séquentiellement. La sortie est correctement échelonnée (au lieu d'arriver en une seule fois au bout de 10 secondes).

C'est bizarre parce que je ne sais pas ce qui est en train de faire qui ferait en sorte que tout ce qui se trouve dans le bloc ci-dessous fonctionne correctement. Si je l'enlève, mon bloc ne fonctionne pas (c'est-à-dire que la sortie s'accumule et se répand ensuite en masse à la fin). Si je n'enlève que quelques bits du code ci-dessus, alors ma chose veut avancer un peu (mais sort séquentiellement le reste bien).

Je n'ai aucune idée de ce que fait le code précédent qui fait que mon (dernier bloc) fonctionne comme il le devrait, ou comment l'abréger afin qu'il fasse encore fonctionner complètement ce dernier bloc, ou même comment faire ce qui précède code invisible sur la page tout en permettant au dernier bloc de fonctionner correctement.

(je l'ai testé le script sur Windows 7 Caucho Resin PHP 5 et Linux Apache CGI-BIN PHP 4 plates-formes. Des résultats identiques.)

+0

Les serveurs Web sont conçus et optimisés pour traiter les demandes aussi rapidement que possible. De toute façon, ayez un long sommeil dans un programme CLI qui fonctionne correctement comme un démon - mais pas comme ça dans une page web! – symcbean

+0

cela ressemble vraiment à des trucs expérimentaux/de découverte. pourrait être beaucoup plus facile. – Mathieu

Questions connexes