Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyświetlanie rezultatów skryptu php w trakcie realizacji
Forum PHP.pl > Forum > PHP
arten1986
Witam
Chciałbym się najpierw przywitać bo to mój pierwszy post.

Wracając do tematu. Mam problem z długo wykonującym się skryptem php, który tworzę na potrzeby pracy dyplomowej. Skrypt ten zaczytuje zawartość innej strony www do dalszej analizy. Wszystko już mam, tzn. z czytywanie, znajdowanie interesujących mnie danych i wszystkie interesujące dane zapisane mam w zmiennych php, które zapisuję do bazy MySQL. Mam jednak problem z wyświetleniem tzn. jak normalnie dam np. echo "Cena: $cena" to muszę czekać na efekt do końca skryptu, który w zależności od zadanych parametrów może trwać nawet kilkanaście godzin(testowo zadane parametry uruchomiają go na 1-2 minuty). Docelowo ten skrypt ma chodzić te kilkanaście godzin, ale chciałbym w międzyczasie widzieć co już znalazł, aby było widać efekt jego działania. Dam jakiś przykład dla zobrazowania:

  1. <?php
  2. $ile=0;
  3. for ($i=0; $i<100; $i++)
  4. {
  5. $ile++;
  6. echo "Iteracja nr $ile znalazła Cenę wynoszącą ...";
  7. sleep(1); //opóźnienie skryptu aby trwał troszkę dłużej
  8. }
  9. ?>

Moje rozwiązanie, które mnie nie do końca zadowala to użycie flush, które wyrzuca dane co jakiś czas do przeglądarki.
  1. <?php
  2. $ile=0;
  3. for ($i=0; $i<100; $i++)
  4. {
  5. $ile++;
  6. echo "Iteracja nr $ile znalazła Cenę wynoszącą ...";
  7. sleep(1);//opóźnienie skryptu aby trwał troszkę dłużej
  8. }
  9. ?>

Niestety nie wiem jak przewinąć automatycznie okno przeglądarki do ostatniego wiersza w wynikach( po 10 kolejnych flush-ach treść jest większa od okna przeglądarki i pojawia się pasek boczny, kolejny flush muszę przewijać niżej itd.) i jak wyczyścić okno przeglądarki co np po 50 iteracjach, żeby nie zawiesić jej całkowitym wynikiem.

Najbardziej interesowała by mnie możliwość wrzucenia wyników skryptu do np. textarea i wyniki ostatnio wykonanej iteracji byłyby na samej górze lub ewentualnie mogą być na dole, ale wtedy pole musi się przewijać do ostatniej linijki(aby cały czas były widoczne ostatnio znalezione dane). Linijek będzie docelowo ok 12 400 więc nie wiem czy czyszczenie nie wchodziłoby w grę. Po stworzeniu kombinacji:
  1. <?php
  2. echo "<textarea>";
  3. $ile=0;
  4. for ($i=0; $i<100; $i++)
  5. {
  6. $ile++;
  7. echo "Iteracja nr $ile znalazła Cenę wynoszącą ...";
  8. sleep(1);//opóźnienie skryptu aby trwał troszkę dłużej
  9. }
  10. echo "</textarea>";
  11. ?>

niestety flush wykonuje się jakby jeden raz i nie spełnia dalej swojej roli.


Zastanawiałem się również nad używaniem Ajax lub nawet ramek worriedsmiley.gif

Przepraszam za to "powieść". Mam nadzieję, że napisałem to w miarę zrozumiale i proszę o jakąś podpowiedź. Dziękuję za odpowiedzi.
CuteOne
Stwórz dwa skrypty i jeden plik .html:
1. Odpowiedzialny za pobieranie stron i ich parsowanie (tzw. serwer) - parsowane dane zapisujesz do pliku(np. godzina_minuta_sekunda.txt). Plik ten odpalasz z poziomu konsoli
2. Drugi skrypt to tzw. klient. Jego zadaniem będzie sprawdzanie czy powstał jakiś nowy plik i wyświetlanie jego zawartości
3. Plik index.html, który za pomocą ajaxa będzie odpalał klienta co XX sekund i tworzył nowe okienko dla zwróconych przez niego danych.
wNogachSpisz
A co gdyby pobierać dane z wielu stron jednocześnie? Może byłoby szybciej niż kilkanaście godzin?
arten1986
Cytat(CuteOne @ 21.09.2012, 09:58:04 ) *
Stwórz dwa skrypty i jeden plik .html:
1. Odpowiedzialny za pobieranie stron i ich parsowanie (tzw. serwer) - parsowane dane zapisujesz do pliku(np. godzina_minuta_sekunda.txt). Plik ten odpalasz z poziomu konsoli
2. Drugi skrypt to tzw. klient. Jego zadaniem będzie sprawdzanie czy powstał jakiś nowy plik i wyświetlanie jego zawartości
3. Plik index.html, który za pomocą ajaxa będzie odpalał klienta co XX sekund i tworzył nowe okienko dla zwróconych przez niego danych.


dzięki za odpowiedź, ale nie wiem czy to nie jest za bardzo skomplikowane rozwiązanie tylko do wyświetlania. Ja dane zapisuje do bazy danych i na niej się później opieram w analizach. Chciałem jedynie jakoś pokazać jak mój skrypt pracuje. Zastanawiam się czy opierając się tylko wyłącznie na Ajax nie dało by się tego ugryźć. Moja wiedza na temat Ajax jest podsatwowa. Nie wiem za bardzo, czy można byłoby Ajaxsem pokazywać w textarea wynik z skryptu php wyrzucany przez flush. takie działanie najbardziej byłoby dla mnie pożądane.


Do wNogachSpisz:
Co do tej podpowiedzi to ok, ale dla mnie nie jest aż takim problemem te kilkanaście godzin, a chodziło mi bardziej o wyświetlanie. Już pracuję nad przyśpieszeniem skryptu i tak w mojej ocenie zejdę do 3-4 godzin (ale to maksymalnie). Jednak jest to dużo bo mój promotor czy recenzent mogą nie zgodzić się aż tyle czekać na wyniki wacko.gif


Dzięki za odpowiedzi
CuteOne
Samym AJAX'em tego nie zrobisz, dlaczego? Ponieważ każde żądanie wysyłane przez AJAX'a będzie na nowo odpalało ten sam skrypt - stąd podałem przykład z pseudo serwerem i klientem. Samo stworzenie trzech plików nie jest czymś skomplikowanym (główną część masz już napisaną) a plik sprawdzający bazę i wyświetlający wynik do raczej pikuś smile.gif
wNogachSpisz
W PHP ciężko robić kilka czynności jednocześnie, bo php to jednowątkowe środowisko. Jedyna opcja to kilka procesów skomunikowanych między sobą czy to za pomocą bazy danych, czy socketów, czy shared_memory.

Za to JavaScript do takich zastosowań nadaje się wyśmienicie, a od kiedy wprowadzono "workery", pisanie takiego softu to sama przyjemność.

Czy to musi być w PHP?
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.