Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX][PHP] Przetwarzanie duzej ilosci danych a timeouty
Forum PHP.pl > Forum > Przedszkole
elmozaur
Witajcie.
Tym razem mam spory problem do ogarniecia. Aby ulatwic wyjasnienie problemu i ogolnie wszystko uproscic powiedzmy ze chodzi o wysylanie mejli.

Mam 3 bazy np userow z ich adresami email. Pierwsza zawiera 150 userow, druga 30 000 a trzecia 3 000 000 wpisow.
Na zwyklym hostingu jak odpalam skomplikowane przetwarzanie danych pobranych z moich baz czesto stronka ma time out i po 1-2 minutach pracy pozostaje bialy ekran (odrazu mowie ze nie moge nic grzebac w php.ini ani execution_time ani innych ustawieniach).

Pomyslalem wiec ze moze poprostu wyswietlic normalnie strone i potem przy uzyciu jQuery odpalic AJAXem moje procesy (np. wysylanie mejli lub inne przetwarzanie rekordow).

Pytanie:
zakladajac, ze wpisy w bazach nie zawsze maja kolejne ID (bo np niektore zostaly usuniete) jak moze wygladac teoretyczny system oparty na ajaxie ktory przetworzy wszystkie wpisy z bazy pobierajac je paczkami np po 20 szt. Technicznie napisze to sobie chodzi mi raczej o teorie/zasade
wiem ze dla zapytania sql moge ustawic LIMIT 20 ale nie moge wyobrazic sobie jak uruchamiac kolejne procesy ajaxa skoro nie zawsze mam kolejne ID wpisow?

czy moze pierwszym zapytaniem pobrac wszystkie ID a kolejnym onsuccess: odpalic juz podzielona robote (przy malej ilosci rekordow to moglo by wystarczyc ale przy 3000000 wpisow pobranie wszystkich id zrobienie z tego tablicy i uruchomienie watkow jest malo wydajne).

Chcialbym zrobic taki latwo skalowalny system do wykonywania trudnych zadan. Jak bede mial rozdzielone na poszczegolne ajaxy to nawet bede mogl wpiac w to jakis progressbar z jQuery UI.

czy ktos moze podpowiedziec jak sie za cos takiego zabrac ?

dziekuje i pozdrawiam G
Sephirus
Nie rozumiem do końca sensu... skoro chcesz zrobić coś na styl systemu mailingowego to brak dostepu do zmian ustawień serwera i PHP jest obowiązkowe. Odpowiednie ustawienia skryptów i ich kontrola (max_execution_time, ignore_user_abort itp. itd.) to podstawa w takim systemie. Twoje założenie by przełożyć część funkcjonalności na JS by wykonywało sporą liczbę requestów wysyłających coś itd IMHO się nie sprawdzi bo jest mocno zawodne i do tego wymaga działającej ciąglę przeglądarki. Wystarczy brak połączenia lub cokolwiek i co wtedy? smile.gif

Ale jeśli już chcesz się bawić. Musisz całą operację dobrze zaplanować. Utworzyć w bazie dodatkową tabelę monitorującą przebieg (zawierającą aktualnie przetwarzane ID wpisu itp - czysto w celach "w razie czego"). Następnie wywołuj ajax bezparametrowo (nie podając ID kolejnego wpisu). Przy pierwszym uruchomieniu skrypt pod ajaxem sprawdza które ID jest aktualne (lub jego brak = 0) i zaczyna 20 rekordów. Jak skończy zapisuje ID ostatniego wykonanego wpisu. Kolejne wywołania jadą dalej od ostatniego ID+1 w przód po 20 rekordów aż się skończą. Jeśli dobrze to rozplanujesz to możesz uzyskać do tego nawet fajny monitoring.

Zaznaczam jednak że bez dostępu do ustawień PHP nie będziesz miał nad tym pełnej kontroli...
CuteOne
Tylko po co ci do tego ajax? nie lepiej odpalać ten sam plik w kółko za pomocą header('Location:') z odpowiednim parametrem ?
thek
Można zrobić na kilka sposobów. Dwa najpowszechniej stosowane to:
- flagi którymi określasz co było zrobione a co nie,
- wrzucasz wybrane i interesujące Cię rzeczy do kolejki, z której wykonane rzeczy usuwasz.
Oba mają swoje wady i zalety. Poza tym zamiast AJAXa zawsze możesz mieć działające w tle zadanie cron, które odpala skrypt przetwarzający malutką paczkę.
elmozaur
Sephirus: tak jak pisalem wczesniej system mailingowy to tylko przyklad. Mam poprostu 3 bazy danych podobnego typu zawierajace mala jak i bardzo duza ilosc rekordow.
na kazdym z rekordow musze wykonac kilka roznego rodzaju operacji. Niestety z ta przegladarka i zawieszeniami masz racje.
Pomysl z dodatkowa tabelka bardzo fajny. Myslalem o sesji ciastku lub czyms podobnym ale faktycznie baza wydaje sie bardzo rozsadna.

CuteOne: dobre - tez to przetestuje. Pomysl z baza i ajaxem bardziej mi sie podoba bo mam zwrot tego ile zostalo zrobione i moge uzyc to do narysowania jakiegos progressbaru

thek: flagowanie i kolejkowanie - przy malej ilosci danych ok. jak baza urosnie z 3mln do 10 mln rekordow to flagowanie bedzie spora strata wydajnosci czasu itp.

Bardzo dziekuje wszystkim za zainteresowanie i duza pomoc.
kierunek poszukiwan rozwiazania nakreslony wiec zabieram sie do roboty

Dziekuje
G
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.