Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Długa pętla i postęp
Forum PHP.pl > Forum > PHP
elipsa
Witam,

zastanawia mnie czy jest coś takiego możliwe. Nie bardzo wiem, jak to nazwać, dlatego spróbuję opisać. Gdy mamy jakaś pętlę, która bardzo długo wykonuje jakieś operacje, to jej wynik wyświetli się dopiero po zakończeniu całej pętli. A czy można byłoby tak zrobić, że częściowe wyniki pętli pojawiałyby się na ekranie jeszcze w trakcie jej wykonywania? Mamy np.:

  1. for($i=0; $i<=100000; $i++) {echo($i."<br />\n");}


Po wykonaniu pętli pojawi się słupek liczb od 1 do 100000. A czy można by zrobić, żeby w trakcie wykonywania pętli na ekranie kolejno pojawiały się liczby, w miarę jak pętla je generuje?

Pozdrawiam :-)
tehaha
musiałbyś wykorzystać technologie po stronie użytkownika czyli javascript, ajax lub biblioteka jQuery, php działa po stronie serwera więc takiego efektu nie osiągniesz
thek
Zawsze też może kombinować z flush i ob_flush smile.gif Zależy co skrypt ma robić smile.gif
nu_moon
flush/ob_flush nie zadziała, bo jedyne co to zmienia to buforowanie wyjścia.
Tak jak kolega napisał, jedynym sensownym rozwiązaniem jest użycie JS.
uirapuru
ostatnio podobny problem miałem, funkcja w pętli po każdej iteracji robiła file_put_contents("plik.txt",$jakis_tam_wynik). Z kolei był osobny kontroler_ajax.php, który wyswietlal zawartosc tego pliku. w pętli co kilka sekund był odpytywany przez skrypt JS, a jego wynik był wstawiany w <div> na stronie.

Nie wiem na ile to eleganckie, ale działa smile.gif
thek
nu_moon... Użycie flush/ob_flush w zależności od sytuacji daje wymagane rezultaty. Wiele osób jednak myśli w sposób sekwencyjny. Webowe aplikacje najczęściej tak działają, ale można je próbować zrównoleglić, choć nie jest to proste i nieraz jest to niemal niemożliwe. Wiele zależy od samego pomysłu. Przykładowo weź sobie zrób pętlę ze sleepem 500 i spróbuj wyświetlić numer kroku. Normalny skrypt wyświetli wszystko po zakończeniu skryptu. Użycie ob/ob_flush pozwala to robić "na bieżąco" poprzez wywołanie czyszczenia bufora wewnątrz pętli.
elipsa
OK, dzięki za sugestie, ten pomysł z flushami chyba będzie w moim wypadku najlepszy :-)
nemis
Możesz też zamienić tą pętla na funckje rekurencyjną. Jeśli nie używasz frameworka, który bawi się w ob_start, wszystko wyświetlane będzie w czasie rzeczywistym.
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.