Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt się długo wykonuje - jak wyświetlać postęp?
Forum PHP.pl > Forum > PHP
orafal
Mam długo wykonujący się skrypt, który działa w oparciu o pewną pętlę. Jak można wyświetlać w przeglądarce postęp w tej pętli - na przykład procentowo, tak aby użytkownik wiedział, że przeglądarka się nie zawiesiła.

Dzięki i pozdrawiam.
MaximusDM
hmm w zależności od bazy można ułożyć odpowiedniego selecta, ale to samo osiągniesz odpalając np. zabę - toad
misiek172
na łatwizne idąć można zrobić animowanego GIFa, jesli się zatnie to przestanie się kręcić ;P.

Jeśli chciałbyś mieć ilość / 100% to juz nie takie proste, ponieważ jezeli masz pętle, która nie wiadomo kiedy się kończy no to wtedy nie da się przewidzieć końca, no bo jak? smile.gif Ewentualnie obliczyć średni czas ładowania i według niego liczyć postęp.
LBO
Nie można, PHP nie działa w ten sposób - każda informacja wysłana do przeglądarki jest automatycznie dodawana do Tych wysłanych wcześniej, co skutecznie uniemożliwia zbudowanie wszelkiego rodzaju pasków postępu.




Za to chyba w Perlu się da smile.gif
templar
Kiedyś byłem niestety zmuszony do zrealizowania czegoś takiego.

Upierałem się, wmawiając pracodawcy, że nie dam rady - ale miałem to zrealizować i koniec.

Co więc uczyniłem:

Utworzyłem 2 ramki, bez borderu, w górnej znajdował się animowany GIF odpalany od razu przy załadowaniu, ale jego wyświetlanie znajdowało się w pętli while, która za każdym razem sprawdzała zawartość pliku tekstowego, czy jest w nim jeszcze "0", czy już "1". Po sprawdzeniu tego warunku, jeśli było "0", to <meta refreshem> odświeżałem górną ramkę w intervalu 1-2 sekundy.

W dolnej ramce na starcie skryptu zapodałem ładnie set_time_limit(), później zapis "0" do tego pliku tekstowego, po czym zapis "1" - zaraz po pętli/operacjach obliczeniowych. W tym momencie pętla w górnej ramce odczytała tę "1", zaprzestała wyświetlania GIFa, i wyświetliła informację, że skrypt zakończył swoje działanie.

Pozdrawiam.
LBO
To ja gratuluję samozaparcia i pomysłowości.

Ale nadal nie widzę sensu robienia czegoś w technologii do tego nie przystosowanej.

edit:

I te cykanie w czasie odświeżania w IE, bleh
matix
Weź skorzystaj z funkcji flush(). Dzięki niej możesz zrobić taki prosty postępowy progressbar. Za każdym wykonaniem pętli, niech doda jedno:

  1. <div class="progress"></div>


Załóżmy. Jeśli wykona ich dzisięć to wtedy jest koniec. Wiadomo. A jak to policzyć to już zwykła matma. To takie luźne przemyślenie z rana przed szkołą, więc mogę tu coś pomylić, za to przepraszam tongue.gif

Pozdro smile.gif
orafal
Cytat(LBO @ 16.10.2007, 20:08:36 ) *
Nie można, PHP nie działa w ten sposób - każda informacja wysłana do przeglądarki jest automatycznie dodawana do Tych wysłanych wcześniej, co skutecznie uniemożliwia zbudowanie wszelkiego rodzaju pasków postępu.




Za to chyba w Perlu się da smile.gif


To byłoby też rozwiązanie. Więc jak zrobić, żeby po każdym kroku tej pętli "for" dopisać do już istniejącej treści, że praca posunęła się do przodu i natychmiast wyświetlić to w przeglądarce? Ta pętla nie ma wielu powtórzeń, więc nie zrobi mi się strona długa jak papier toaletowy winksmiley.jpg .
michu2510
A ja przy okazji się zapytam jak zrobić taki pasek jak na o2 w poczcie jest przy uploadzie.
k1ller
robisz sobie taka funkcje w PHP:


function UpdateDiv($mess)
{
echo '<script type="text/javascript">';
echo 'Update_cue_info(\''.addslashes($mess).'\');';
echo '</script>';
flush();
}

do tego na stronie musisz miec ten skrypcik:
function Update_cue_info(mess)
{

var update_info_el = document.getElementById('nazwa_twojego_diva_do_podmianek');
update_info_el.innerHTML = mess;
}
</script>


no i oczywiscie sam div gdzies na stronie:
<div id="nazwa_twojego_diva_do_podmianek">PLaduje...</div>


Jezeli nie mozesz wyliczyc procentowo postepu, to przynajmniej mozesz wyswietlac informacje co skrypt robi, np w jakim momencie sie znajduje albo cokolwiek.

Robisz to odpalajac w php

UpdateDiv('Teraz cos robie.');
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.