Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Postęp wykonania pętli na żywo
Forum PHP.pl > Forum > Przedszkole
kaktus283
Witam, mam pewien problem i niezbyt wiem jak go rozsądnie rozwiązać.
Piszę pewną większą aplikację, która będzie mieć automatyczną aktualizację w PHP (to jednak jest najmniej ważne). Mam pewien kod, który się nie przyda w niczym ale przybliżę jak to wszystko działa i czego oczekuję. Tak więc mam pętle "for", która wykonuję dosyć dużą ilość poleceń i chciał bym aby PHP zwracało mi na ekran aktualny postęp pętli. Oczywiście echo`wać mogę sobie długo i namiętnie a to i tak wyświetli się dopiero, gdy skrypt przestanie pracować. Jest jakiś sposób by pętla zwracała wynik po każdym wykonaniu, nie chcę rozwiązania tylko naprowadzenia na rozsądną drogę. Pozdrawiam.
tab
w php to niemozliwe, jezeli zalezy Ci na takim pasku postepu musiałbys to wszystko przeniesc do ajaxa.
vokiel
Poczytaj o flush, ob_flush

  1. foreach(range(1,9) as $n){
  2. echo $n."\n";
  3. flush();
  4. sleep(1);
  5. }
kaktus283
Cytat(vokiel @ 27.10.2012, 17:39:52 ) *
Poczytaj o flush, ob_flush

  1. foreach(range(1,9) as $n){
  2. echo $n."\n";
  3. flush();
  4. sleep(1);
  5. }

Stworzyłem testowy plik z Twoim kodem, ale nadal dopiero po wykonaniu całej pętli wyświetla się zwrócona wartość zmiennej n.
Na dodatek strasznie długo się to wykonuje i zżera dużo pamięci RAM co jest niezbyt optymalnym rozwiązaniem.
Ma ktoś inną propozycję jak to rozwiązać bez używania AJAX`a?
vokiel
Jeśli to Ci nie działało, to pewnie ze względu na ustawienia php. Sprawdź ten przykład:

  1. @ini_set('zlib.output_compression',0);
  2. @ini_set('implicit_flush',1);
  3. date_default_timezone_set('Europe/Warsaw');
  4.  
  5.  
  6. echo "Start<br />\n";
  7.  
  8. foreach(range(1,9) as $n){
  9. echo date('H:i:s').' '.$n."<br />\n";
  10. flush();
  11. sleep(1);
  12. }
kaktus283
Cytat(vokiel @ 30.10.2012, 09:54:57 ) *
Jeśli to Ci nie działało, to pewnie ze względu na ustawienia php. Sprawdź ten przykład:

  1. @ini_set('zlib.output_compression',0);
  2. @ini_set('implicit_flush',1);
  3. date_default_timezone_set('Europe/Warsaw');
  4.  
  5.  
  6. echo "Start<br />\n";
  7.  
  8. foreach(range(1,9) as $n){
  9. echo date('H:i:s').' '.$n."<br />\n";
  10. flush();
  11. sleep(1);
  12. }

Nadal wyrzuca dopiero, gdy kod zakończy się wykonywać ale rozwiązałem to troszkę w inny sposób, mianowicie zapisuje liczbę zmiennej z pętli do pliku 'update.txt' a w drugim pliku użyłem odświeżania co 500ms oraz elementu <progress> do pokazania paska postępu. W każdym bądź razie dzięki wielki za pomoc : )
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.