Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Opóźnienie w pętli
Forum PHP.pl > Forum > Przedszkole
kamilw
Witajcie,
Mam spory problem. Zrobiłem sobie pętle while. Generuje ona linie teksty. Chciałbym ją trochę opóźnić tz. pętelka wykona się raz poczeka x sekund i następnie znowu wykona. I tak w kółko. Czy jest to możliwe? Jeśli tak to jak?

Z góry dziękuje za pomoc.
PS. Szczęśliwego Nowego Roku.
czachor
sleep()

Tylko nie wiem, co oznacza "w kółko", bo jak użytkownik wyłączy przeglądarkę, to pętla też skończy swoje.
kamilw
Mój Drogi opóźnia. Tylko gdy uruchomie skrypt to wszystkie opóźnienia są generowane. A dopiero potem wyswietlają się dane z pętli.
Ja chciałybym inaczej
Żeby każde powtórzenie wyświetliło tekst i poczekało x sekund.
Hazel
Z tego co się orientuję, to niestety w PHP to nie jest realne.
kamilw
Jeśli w php nie. To w jakim języku? javascript?
Hazel
Tak, javascript. Tam masz konstrukcje window.setTimeout i window.setInterval, odsyłam do wyszukiwarki po więcej informacji.
Liko
Cytat(Hazel @ 28.12.2007, 20:16:03 ) *
Tak, javascript. Tam masz konstrukcje window.setTimeout i window.setInterval, odsyłam do wyszukiwarki po więcej informacji.


Ja również odsyłam po więcej informacji Ciebie do manuala PHP.

Kod w PHP:
  1. <?php
  2. for($iFoo = 0; $iFoo <= 10; $iFoo++) {
  3.  
  4. printf("Int: %s <br />", $iFoo);
  5. flush();
  6. sleep(4);
  7.  
  8. }
  9.  
  10. ?>
Hazel
Przykro mi, ale to tak nie działa. Wyświetla się wszystko naraz po 10x sekund, gdzie x to argument sleep().
A faktycznie jedynym sposobem na to, żeby strona wyswietlała się dynamicznie, jest używanie JavaScriptu.
Liko
Przykro mi to Ci mówić, ale działa. Lecz jeżeli używasz IE to musisz wysłać 256 bajtów wcześniej abyś zobaczył efekt. A więcej masz w dokumentacji:
Cytat
Several servers, especially on Win32, will still buffer the output from your script until it terminates before transmitting the results to the browser.

Server modules for Apache like mod_gzip may do buffering of their own that will cause flush() to not result in data being sent immediately to the client.

Even the browser may buffer its input before displaying it. Netscape, for example, buffers text until it receives an end-of-line or the beginning of a tag, and it won't render tables until the </table> tag of the outermost table is seen.

Some versions of Microsoft Internet Explorer will only start to display the page after they have received 256 bytes of output, so you may need to send extra whitespace before flushing to get those browsers to display the page.


Mam nagrać Tobie film i pokazać localhosta?
Hazel
Nie wiem w czym leży problem, ale pod żadną przeglądarką nie działa tak jak powinno. Filmu nagrywać nie musisz, wierzę Ci, ale niestety u mnie nie działa nigdzie. Sprawdzałem pod FF, Operą, IE, Safari, Flock i wiecej mi się nie chciało. Po prostu u mnie to nie działa. Ani pod PHP 5, ani pod PHP 4.
Liko
Tak więc oboje mamy rację. Chodzi o to, że PHP wysyła dane, lecz przeglądarka ich nie wyrzuca, lub też drugi przypadek kiedy na serwerze w php.ini nie masz ustawione implicit_flush = on, output_buffering = off. Wtedy powinieneś widzieć zamierzony efekt.
Hazel
No już chciałem powiedzieć, że mnie przekonałeś, bo to faktycznie byłoby miłe i burzyłoby parę moich teorii na temat php, i umożliwiało znaczące działania bez js, więc byłem gotowy przyznac Ci rację z uśmiechem, ale niestety nawet po zmianie ustawień implicit_flush i output_buffering nic specjalnego się nie dzieje. A że PHP wysyła dane, to jest fakt, tak właśnie działa sleep(). Ale chodzi bardziej o efekt niż fakt...
Liko
Konkluzja ostateczna: za dużo zachodu, aby działało to u wszystkich. Także zwracam rację Hazelowi i przepraszam za porywczość. Jednak pomysł z wykorzystaniem JS znacznie prostszy i wygodniejszy w zastosowaniu.
kamilw
A możecie pomóć? Jestem zielony w js.
Hazel
  1. <div id="przykladowy_div">
  2. <script type="text/javascript">
  3. function display()
  4. {
  5. document.getElementById("przykladowy_div").innerHTML += "dodany tekst";
  6. }
  7. window.setInterval(display, 1000);</script>

Coś takiego, nie wiem, czy dokładnie o to chodzi. Jeśli nie, to daj kawałek kodu i będziemy radzić tongue.gif
kamilw
Jako że moja pętla jest skomplikowana daje prosty szkielet
  1. <?
  2. $i = 1;
  3. while ($i <= 10) {
  4. echo $i++;
  5. echo"<br />";
  6. }
  7. ?>

Chciałbym żeby skrypt wyświetlił "1" poczekał x sekund,wyświetlił "2" itd.
Hazel
Podałem rozwiązanie. Stosuj setInterval, nie baw się w timeouty wewnątrz pętli, bo nic dobrego z tego nie wyjdzie. Daj cały kod, jeśli czegoś nie rozumiesz.
kamilw
Ale Twoje rozwiązanie nie działa. Wyświetli 1,2,3 i potem powtarza dodatkowy text. A ja chciałbym żeby wyświetliło 1 + ewentualny dodatkowy text wtedy poczekał i wyświetlił 2.
Hazel
Nie wiem czy dokładnie rozumiem, ale jak chcesz to możesz zmienić ten kod żeby nie wyświetlał samych liczb, tylko coś jeszcze...
  1. <div id="cos"></div>
  2. <script type="text/javascript">
  3. var counter = 0;
  4. Update();
  5. function Update()
  6. {
  7. if (counter<10)
  8. {
  9. counter++;
  10. document.getElementById("cos").innerHTML=counter;
  11. ID=window.setTimeout("Update();",1000);
  12. }
  13. }
kamilw
Nie, nie.

Mam w pętli php zmienną. I chciałbym tak.


Wyświetliło zmienną { Czyli wykonało
Poczekało { 1 raz pętle.

Wyświetliło zmienną { Czyli wykonało
Poczekało { 2 raz pętle.

........................

Tylko w formacie
zmienna <br />
zmienna </br>

Żeby nie podmnieniało tylko jedno pod drugim.
Hazel
  1. <div id="cos"></div>
  2. <script type="text/javascript">
  3. var counter = 0;
  4. Update();
  5. function Update()
  6. {
  7. if (counter<10)
  8. {
  9. counter++;
  10. document.getElementById("cos").innerHTML+="<br>" + counter;
  11. ID=window.setTimeout("Update();",1000);
  12. }
  13. }

edit: Do tego można dołożyć wykrywanie funkcjonalności metody getElementById:
  1. <script type="text/javascript">
  2. var counter = 0;
  3. Update();
  4. function Update()
  5. {
  6. if (counter<10)
  7. {
  8. if(document.getElementById)
  9. {
  10. counter++;
  11. document.getElementById("cos").innerHTML+="<br>" + counter;
  12. ID=window.setTimeout("Update();",1000);
  13. }
  14. else
  15. {
  16. document.write("<br>" + counter);
  17. ID=window.setTimeout("Update();",1000);
  18. }
  19. }
  20. }
kamilw
No dzięki działa. A jak teraz do tego wsadzic inne dane niż liczby. Zaznaczam że mam pętle w php.
Hazel
Ergh...
Pisałem Ci n postów temu, żebyś lepiej dał cały kod php, opracowałem Ci cały js, a Ty mówisz mi teraz że nie o to chodzi blinksmiley.gif
Daj ten kod php. mad.gif
kamilw
  1. <?php
  2. $ciosu=$users[atk]-$zdarz[obr]; if($ciosu < 0){$ciosu=0; } //Cios postaci
  3. $ciosp=$zdarz[atk]-$users[obr]; if($ciosp < 0){$ciosp=0; }//Cios potwora
  4.  
  5.  
  6.  
  7.  
  8. $atakp=$users[hp];
  9. $ataku=$zdarz[hp];
  10.  
  11. while ($a=1){
  12. $ataku=$ataku-$ciosu; 
  13. $atakp=$atakp-$ciosp;
  14. $c=rand(1, 15);
  15. if($c==8){$ciosu=$ciosu*2;}
  16.  
  17. echo"<div id='useratak'><strong>$_SESSION[zalogowany]</strong> zadał cios"; if($c==8){echo" krytyczny";} echo" dla <strong>$zdarz[nazwa]</strong> o wartosci <strong>$ciosu</strong>. <h id='hppot'>"; if($ataku < 0){$ataku=0;} echo" $ataku</h><h id='hpusr'>"; if($atakp < 0){$atakp=0;} echo" $atakp</h></div>"; if($c==8){$ciosu=$ciosu/2;} 
  18. if($ataku <= 0){}else{echo"<div id='potworatak' ><strong>$zdarz[nazwa]</strong> zadał cios dla <strong>$_SESSION[zalogowany]</strong> o wartosci <strong>$ciosp</strong>. <h id='hppot'>"; if($atakp < 0){$ataku=0;} echo" $ataku</h><h id='hpusr'>"; if($atakp < 0){$atakp=0;} echo" $atakp</h></div>";}
  19.  
  20. if($ataku <= 0){ echo"Wygrałes<br /> "; 
  21. $kas=rand($zdarz[kas], $zdarz[kasm]);
  22. $kasu=$users[kas]+ $kas;
  23. $dsw=$users[dsw]+ $zdarz[dsw];
  24.  
  25. $a = "UPDATE users SET hp='$atakp', kas='$kasu', dsw='$dsw', ruch='$ruch' WHERE login = '$_SESSION[zalogowany]'";
  26. $b = mysql_query ($a) or die(mysql_error());
  27. echo" zyskales: <strong>$kas$</strong><br/> Doświadczenie + $zdarz[dsw] ";
  28.  
  29. break; }
  30. if($atakp <= 0){ echo"Przegrałeś<br />"; 
  31.  
  32. $kas=rand($zdarz[kas], $zdarz[kasm]);
  33. $kasu=$users[kas]- $kas;
  34. $dsw=$users[dsw]- $zdarz[dsw];
  35. if($dsw < 0){$dsw=0; }
  36.  
  37. $a = "UPDATE users SET kas='$kasu', dsw='$dsw', ruch='$ruch', hp='$atakp' WHERE login = '$_SESSION[zalogowany]'";
  38. $b = mysql_query ($a) or die(mysql_error());
  39. echo" straciles: <strong>$kas$</strong><br/> Doświadczenie - $zdarz[dsw]";
  40.  
  41.  
  42. break;}
  43.  
  44.  
  45.  
  46.  
  47. }
  48. ?>



Wpadłem na inny pomysł. Wystarczy mi tylko zrobić żeby w divie o jakims tam id wyświetliiło zawartosc poczekało x sekund i wyswietliło zawartosc innego diva
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.