Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] [ajax]
Forum PHP.pl > Forum > PHP
Cezar708
Witam,

mam do wykonania pasek postępu. Ma się pojawić po wysłaniu formularza poprzez AJAX. Na serwerze wykonują się zapytania do bazy, jest ich strasznie dużo, więc trochę to potrwa. Niestety nie mam dobrego pomysłu jak taki pasek postępu wykonać. A tak naprawdę nie wiem jak ściągać postęp *wynik procentowy) z serwera.

na początku wykonywania skryptu obsługującego formatkę sprawdzam ile będzie w sumie zapytań (wz - akurat dość łatwo to obliczyć). Następnie za każdym razem gdy kolejne zapytanie jest wykonane zwiększam licznik wykonanych zapytań (z).

następnie wg wzoru:

Cytat
wynik [%] = round( z/wz * 100);


obliczam progres. Następnie ten wynik chciałem skądyś ściągnąć tylko, że nie mam pojęcia jak sad.gif

oto jak próbowałem:

1. Za pomocą AJAXa próbowałem ściągnąć wartość wyniku z sesji. Ale chyba dwa procesy nie mają dostęp do tego samego pliku sesji. Próba nie wyszła... nic nie udało się ściagnąć

2. wynik zapisywałem w pliku zewnętrznym, a następnie za pomocą ajaxa, próbowałem odczytać tę wartość... próba znowu się nie udała.

Czy ktoś z Was miał kiedyś taki problem? jeśli tak to jak sobie z nim poradziliście.

Pozdrawiam
kitol
Ja to zrobiłem mniej więcej tak:
1. wysyłam header strony
2. w headerze znajduje się JS, o którym napiszę poniżej
3. następnie po wykonaniu każdego zapytania do strony dopisuję jakiś specyficzny znacznik (na przykład $$$_000001) po każdym wykonanym zapytaniu wartość liczbowa się zwiększa. Wysyłam zawartość bufora do przeglądarki: ob_flush(); flush();

Javascript wysyłany w punkcie 2. Uruchamia mechanizm wywoływane co 1 sekundę, którego zadaniem jest wyszukiwanie w kodzie strony znaczników, i pobieranie wartości największego z nich. Gdy znam wartośc ostatniego znacznika rysuję pasek postepu (w JS oczywiście). Ajax jest niepotrzebny
Cezar708
hmm brzmi fajnie tylko szczerze mówiąc nie rozumiem...

jak to w headerze wysyłasz js? Mógłbyś dać mi jakiś przykładowy kod, który by mi to trochę wyjaśnił?

Pozdrawiam
kitol
Nie mam w tym momencie dostępu do tego kodu, więc gotowca ci nie dam.
Pisząc header miałem na myśli <HEAD></HEAD>. Tam umieszczam JS z funkcją która wykonuje się cyklicznie co sekundę i wyszukuje w kodzie strony (dokładnie w innerHTML jakigoś elementu np.DIV-a ostatniego wystąpienia znacznika). Wartość liczbowa za znacznikiem odpowiada numerowi wykonanego zapytania). Ważne jest aby po każdym wykonaniu zapytania zawartość bufora została wysłana do przeglądarki. Element do którego wpisujemy znaczniki w trakcie wykonywania skryptu powinien być ukryty (za pomoca css).
Schemat jak ma wyglądać wysyłana strona:

<HTML>
<HEAD>
<script tytaj dajemy skrypt>
</HEAD>
<BODY>
<DIV id="postep">
tutaj pojawiają się co chwila nowe znaczniki określające postęp
$$$_000000
$$$_000001
$$$_000002
$$$_000003
$$$_000004
Cezar708
Cytat(kitol @ 14.04.2008, 10:38:51 ) *
3. następnie po wykonaniu każdego zapytania do strony dopisuję jakiś specyficzny znacznik (na przykład $$$_000001) po każdym wykonanym zapytaniu wartość liczbowa się zwiększa. Wysyłam zawartość bufora do przeglądarki: ob_flush(); flush();

(...) Ajax jest niepotrzebny


Cytat(kitol @ 14.04.2008, 12:03:55 ) *
(...)
tutaj pojawiają się co chwila nowe znaczniki określające postęp
$$$_000000(...)


hmm... no ale jak się "pojawia" skoro "ajax jest niepotrzebny", chodzi o to, że strona jest cała przeładowywana?

Poza tym nie tu jest problem. Problem leży bardziej po stronie wysyłania informacji o progresie od serwera do przeglądarki. Pamiętaj, że jeden proces działa w tle, a drugi chce odzyskać informacje, które ten pierwszy musi jakoś przekazać ... i tu mam problem. Potem pobranie go czy ewentualna obróbka nie przyniesie mi problemu.

Pozdrawiam
kitol
Ajax nie jest potrzebny. Wszystko działa podczas jednego długiego ładowania strony. Wygląda to w ten sposób, że po wysłaniu tego co nazwałem "headerem" a więc nagłówka strony z javascriptem zaczyna się on wykonywać cyklicznie. Mamy więc tak jakby dwa równolegle działające procesy: z jednej strony serwer wykonujący zapytania i po każdym dopisujący do treści informacje (znaczniki) 2. działający cyklicznie JS odbierający i analizujacy informacje (znaczniki). Cała filozofia opiera się o to, że JS zaczyna działać zanim ładowanie całej strony zostanie ukończone.

EDIT:
Wygrzebałem kod:

  1. <html>
  2. <head>
  3. <script language="JavaScript">
  4. <!--
  5. var loaded=0;
  6. setTimeout("info()",1000);
  7. function info() {
  8. txt=document.body.innerHTML;
  9. ar=txt.split("_prg_:");
  10. prg=ar[ar.length-1];
  11. if (ar.length>1) document.getElementById('progress').innerHTML="Liczba wykonanych zapytan: "+ prg;
  12. setTimeout("info()",1000);
  13. }
  14. //-->
  15. </script>
  16. </head>
  17. <body>
  18. <div id="progress">&nbsp; </div>
  19. <div id="ukryj">
  20. <?php
  21. for ($i=0;$i<100;$i++) {
  22. echo "\n_prg_:".$i;
  23. flush();
  24. sleep(1);
  25. }
  26. ?>
  27. </div>
  28. </body>
  29. </html>


specjalnie nie ukrywałem diva ze znacznikami (id="ukryj") bo lepiej widać jak to działa.
Cezar708
acha... teraz zrozumiałem, sprytne

dzięki za pomoc
raphi
Ma tylko jedną wadę - po minucie pojawia się komunikat:

Fatal error: Maximum execution time of 60 seconds exceeded in C:\...\progres.php on line 26
puc
na samym początku skryptu daj
  1. set_time_limit($seconds)
gdzie $seconds to maksymalna liczba sekund dla wykonywania skryptu, przy czym 0=nieskonczonosc
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.