Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Postęp wykonania pętli na żywo
kaktus283
post 27.10.2012, 16:14:06
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 2
Dołączył: 26.03.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
tab
post 27.10.2012, 16:48:36
Post #2





Grupa: Zarejestrowani
Postów: 75
Pomógł: 20
Dołączył: 8.10.2012

Ostrzeżenie: (0%)
-----


w php to niemozliwe, jezeli zalezy Ci na takim pasku postepu musiałbys to wszystko przeniesc do ajaxa.

Ten post edytował tab 27.10.2012, 16:50:25
Go to the top of the page
+Quote Post
vokiel
post 27.10.2012, 17:39:52
Post #3





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


Poczytaj o flush, ob_flush

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


--------------------
Go to the top of the page
+Quote Post
kaktus283
post 29.10.2012, 18:28:18
Post #4





Grupa: Zarejestrowani
Postów: 47
Pomógł: 2
Dołączył: 26.03.2010

Ostrzeżenie: (0%)
-----


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?

Ten post edytował kaktus283 29.10.2012, 18:30:00
Go to the top of the page
+Quote Post
vokiel
post 30.10.2012, 09:54:57
Post #5





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


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. }


--------------------
Go to the top of the page
+Quote Post
kaktus283
post 30.10.2012, 10:55:49
Post #6





Grupa: Zarejestrowani
Postów: 47
Pomógł: 2
Dołączył: 26.03.2010

Ostrzeżenie: (0%)
-----


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 : )
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 09:54