konto usunięte

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

Witam ponownie.

Tym razem zastanawia mnie inny problem wydajnościowy i chciałbym poradzić się forumowiczów odnośnie zastosowania najlepszego i najwydajniejszego rozwiązania. Założenia są następujące. Mam tabelę z polami: ADRES_WWW, KEY, FLAGA. Rekordów w bazie jest powiedzmy 1.000-3.000. Potrzebuję cronem załóżmy co 5 sek pobierać poszczególny rekord (za każdym razem następny) następnie z wyciągniętego ADRES_WWW, sparsować podaną tam stronę pod kątem wystąpienia w niej łańcucha znaków określonego przez KEY. FLAGA to pole przyjmujące wartości {0,1,2}. Jeśli dana strona zawiera KEY to ustawiamy FLAGA na 1, jeśli nie to na 2. Brak sprawdzenia danej strony to FLAGA=0. Po sprawdzeniu wszystkich rekordów w bazie następuje wysłanie do admina @ z informacjami o pozycjach z FLAGA=2, a następnie zmiana FLAGA na 0 dla wszystkich rekordów i zabawa zaczyna się od nowa!

To są założenia i mój pomysł na mechanizm sprawdzania czy wszystkie serwisy, które posiadają mój widget mają odpowiedni kod na stronie (czy go nie usunęli powodując tym samym manipulacje). Tyle co mogę powiedzieć.

Pytanie:
- czy jest to przy tej ilości serwisów (1-3k) wydajne?
- czy ważny jest dobór języka skryptowego(PHP czy do takich zadań lepiej jednak Python,PERL)?
- może ktoś ma rozsadniejszą metodę na rozwiązanie tego problemu?

Z góry dzięki za podpowiedzi i liczę na owocną dyskusję jak przy ostatnim moim temacie o wydajności na tej grupie.


Pozdrawiam,
Piotr Parzentny.

konto usunięte

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

A moze w druga strone:

1. Serwujesz widget jako js z odwolaniem do Twojego serwera KEY przesylany jest jako parametr w URL skryptu
2. Skrypt nie jest po prostu zwyklym JS, ale kodem php ktory generuje JS'a a przy okazji sprawdza KEY, zapisuje kto kiedy itp

Czy takie rozwiazanie pasuje do Twojego przypadku?
Michał Płonka

Michał Płonka Programista PHP

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

Również obstawiałbym raczej jakieś "pingowanie" ze strony "klienta". Pobranie zawartości strony i sprawdzenie jej pod kątem wystąpienia ciągu może zająć trochę czasu. Pingowanie sprawdzi się jednak tylko w sytuacji, gdy ktoś odwiedzi stronę (uruchomi się skrypt JS).

konto usunięte

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

Dzięki za odpowiedzi, ale chyba się nie zrozumieliśmy. Jeśli jakiś użytkownik usunie widget ze strony (a ma go posiadać) to nie nastąpi sprawdzenie i wysłanie do mnie informacji! Więc dalej nie będę wiedział czy ma go "zainstalowanego" na swojej WWW. Załóżmy, że ma zainstalowany, a nikt akurat na stronę nie wchodzi. Skrypt jest, a mi w systemie by wyszło, że nie ma, gdyż nie otrzymuje odpowiedzi od JS. Błąd.

No chyba, że ja Was jakoś źle zrozumiałem ;)

Pozdrawiam.
Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

PERL jest dobry do takich rzeczy (pisałem boty).

nie jestem przekonany co do konieczności użycia CRON.

konto usunięte

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

Igor Janicki:
PERL jest dobry do takich rzeczy (pisałem boty).

nie jestem przekonany co do konieczności użycia CRON.

Dlaczego? Jak inaczej by to Pan rozwiązał? Wydawało mi się, że lepiej zrobić to CRONem aby obciążenie serwera było bardziej rozłożone. Jednorazowa operacja na tylu rekordach nawet w nocy to może być spore obciążenie.
Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

proces może poczekać zwalniając zasoby.
takie coś można przetestować pod innymi systemami.
Marcin P.

Marcin P. Zakamuflowany
programista

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

Ja wszystkie roboty pisze w php.

while(true) {
// .. kod obsługujący bota
}

A potem z konsoli screen php skrypt.php i zapominam o robocie do czasu restartu serwera ;)
Michał Płonka

Michał Płonka Programista PHP

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

@Parzol:
No to może połączyć obie idee? Robisz pingowanie ze strony klienta. Jeżeli nie otrzymałeś pinga przez np. 1 dzień (przykładowo!) to wówczas parsujesz stronę w poszukiwaniu klucza. Takie połączenie mogłoby się sprawdzić.

@Marcin Pilśniak:
A co w przypadku gdy z jakiegoś dziwnego powodu Twój skrypt się wykrzaczy? Masz jakieś mechanizmy zgłaszania takich sytuacji? Poza tym jestem ciekaw jak radzisz sobie z wyczerpaniem pamięci przez PHP. Ja osobiście puszczam zadania w CRONie np. co 5 minut, a wewnątrz tworzonego kodu robię pętle while() (podobną do Twojej) i ustawiam maksymalny czas wykonania skryptu na np. 4,5 minuty (0,5 minuty na złapanie oddechu dla serwera). Po drodze w pętli jest oczywiście sleep().
Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

Marcin P.:
Ja wszystkie roboty pisze w php.

wiesz, kiedyś, dla sportu, napisałem parsowanie formuł (z odwrotną notacją) w COBOL. można ;)

aha jeśli chodzi o CRON to są rozwiązania dla Windows, np. http://www.cronforwindows.com/
można testować :)

konto usunięte

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

@Igor:
Dzięki. Te czekanie na zwolnienie zasobów to może być to.

@Marcin:
Takie coś nie wchodzi w grę. Zbyt proste i jak pisał przedmówca za niebezpieczne.

@Michał Płonka:
To jest to! Taka hybryda bardzo mi się podoba. Dobry pomysł. Dzięki.

Ciekawi mnie jeszcze jedna kwestia. Czy jest rzeczywiście sens pisać to pod PERL/Python zamiast PHP? Nie ukrywam, że pracuje na codzień z PHP, a PERL/Python tylko "liznąłem". Jednak dla kwesti znacznej wydajności mógłbym się podszkolić w tym temacie. Czy np. te same wbudowane funkcje które tutaj mogłyby mi się przydać pracują aż tak bardzo różnie pod tymi językami?

Pozdrawiam wszystkich.Piotr Parzentny edytował(a) ten post dnia 05.11.09 o godzinie 16:02
Marcin P.

Marcin P. Zakamuflowany
programista

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

Michał Płonka:
@Marcin Pilśniak:
A co w przypadku gdy z jakiegoś dziwnego powodu Twój skrypt się wykrzaczy? Masz jakieś mechanizmy zgłaszania takich sytuacji? Poza tym jestem ciekaw jak radzisz sobie z wyczerpaniem pamięci przez PHP. Ja osobiście puszczam zadania w CRONie np. co 5 minut, a wewnątrz tworzonego kodu robię pętle while() (podobną do Twojej) i ustawiam maksymalny czas wykonania skryptu na np. 4,5 minuty (0,5 minuty na złapanie oddechu dla serwera). Po drodze w pętli jest oczywiście sleep().

Pytanie co takiego może się zdarzyć.
- Wyciek pamięci - pierwsza rzecz którą zawsze testuje. Właśnie sprawdziłem jednego robota uptime od 88dni, memory_limit dla tej instancji ustawiony na 5mb(bot oparty na zend framework)

- Błąd bazy danych mysql - przechwycenie wyjątku, wysłanie maila informującego - rozpoczęcie kolejnej próby. W wypadku 3 niepowodzeń pod rząd automatyczny exit + mail do mnie.
Takie coś nie wchodzi w grę. Zbyt proste i jak pisał przedmówca za niebezpieczne.
Proste rozwiązania są najlepsze, i nie są one w cale niebezpieczne. Skrypty w innych językach programowania będą wyglądać tak samo.

Parsowanie strony internetowej, zapytania do bazy danych - w zasadzie bez znaczenia czasowego i obciążenia dla serwera. Najbardziej wpływającym elementem na czas wykonania jednej pętli będzie połączenie się z zew. serwerem.
Marcin P.

Marcin P. Zakamuflowany
programista

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

Igor Janicki:
Marcin P.:
Ja wszystkie roboty pisze w php.

wiesz, kiedyś, dla sportu, napisałem parsowanie formuł (z odwrotną notacją) w COBOL. można ;)
Jasne, ale tutaj nie potrzebujemy żadnych wymyślnych bibliotek które nie są dostępne/są kiepskie w php.

Mamy curl by połączyć się ze stroną, i strpos by znaleźć szukany kod javascript.
W razie potrzeby bardziej zaawansowanej analizy kodu html w celu znalezienia naszego kodu javascript możemy wykorzystać tidy, też dostępne jako bibilioteka w php.
Michał Płonka

Michał Płonka Programista PHP

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

Marcin P.:
- Wyciek pamięci - pierwsza rzecz którą zawsze testuje. Właśnie sprawdziłem jednego robota uptime od 88dni, memory_limit dla tej instancji ustawiony na 5mb(bot oparty na zend ramework)
Jak się przed tym zabezpieczasz? Tylko poprzez zwalnianie zasobów (w stylu mysql_free_result()), unset() oraz maksymalne wykorzystywanie już powołanych obiektów zamiast tworzenia nowych?

Powyższe pytanie jest dla mnie dość istotne, bo będę pisał bota, który ma pracować bez przerwy pobierając przy tym w krótkich odstępach czasu sporo danych poprzez SOAP. Generalnie cały projekt będzie oczywiście w Kohanej, ale zastanawiam się, czy takiego bota nie zrobić w czystym PHP w celu uniknięcia narzutu ze strony frameworka. Biorąc pod uwagę, że opisany przez Ciebie bot chodzi pod ZF to może jednak nie ma sensu się w to babrać? Chciałbym dowiedzieć się o Twoich doświadczeniach na tym polu - pozwoli mi to uniknąć pisania dwóch botów tylko dla testów.

Z góry dzięki za informacje.
Marcin P.

Marcin P. Zakamuflowany
programista

Temat: Parsowanie stron, wydajność serwera i język - dyskusja

Michał Płonka:
Marcin P.:
- Wyciek pamięci - pierwsza rzecz którą zawsze testuje. Właśnie sprawdziłem jednego robota uptime od 88dni, memory_limit dla tej instancji ustawiony na 5mb(bot oparty na zend ramework)
Jak się przed tym zabezpieczasz? Tylko poprzez zwalnianie zasobów (w stylu mysql_free_result()), unset() oraz maksymalne wykorzystywanie już powołanych obiektów zamiast tworzenia nowych?
Jeżeli wszystko działa w pętli to obiektów nie trzeba unsetowa, albo ich zerować, php robi to automatycznie. Chyba że! ten obiekt w swoich definicjach ma inne obiekty. Wtedy trzeba go nullować, a za żadne skarby nie unsetować! W ZF korzystam z adaptera PDO który sam zwalnia mi pamięć, więc to też nie problem. Innych możliwości wycieku pamięci chyba nie ma, ja się przynajmniej z innymi nie spotkałem.

W ZFie musiałem wyłączyć tylko jedną rzecz - profilowanie zapytań sql, ponieważ to powodowało zbyt duży przyrost pamięci po paru iteracjach. Tak samo trzeba wyłączyć różne loggery, debugery.

Następna dyskusja:

Język PHP 4 / PHP5




Wyślij zaproszenie do