Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt wykonuje się ponad 10 minut, po czym się wysypuje ;)
Forum PHP.pl > Forum > PHP
kilas88
Witam,

Nie bardzo wiem jak nazwać temat, ale mam dość nietypowy problem i nawet nie wiem od czego zacząć, by go rozwiązać. Otóż mam skrypt, który wykonuje się kilka, czasem kilkanaście lub kilkadziesiąt minut.

Skrypt ten przetwarza dokument HTML (książkę w wersji HTML), która ma sporo tekstu, od 10 MB wzwyż. Książkę muszę przepuścić przez kilka wyrażeń regularnych i HTMLPurifier (czyli sporo się tam dzieje). Całość powinno wykonywać się kilkanaście minut. Niestety nie wykonuje się - serwer Apache po 10 minutach sam się resetuje (używam WampServer pod XP). Chrome wywala Error 101: Strona internetowa jest niedostępna, natomiast Opera "Połączenie przerwane przez serwer".

Gdzie szukać rozwiązania? Oczywiście mam ustawione odpowiednio memory_limit czy max_execution_time na odpowiednio duże wielkości.

Ps. gdy dam plik HTML ważący powiedzmy 5MB i wykonujący się 5 minut to nic się nie wysypuje...
Mr Albert
Prawdopodobnie koniec ramu. Spróbuj otwierać plik fragmentami.
tehaha
takie coś najlepiej oprzeć o cron i przetwarzać partiami np. po ileś linijek, ciężko powiedzieć coś konkretnego bo nie dałeś żadnych rzeczowych informacji
kilas88
nie mogę za bardzo przetwarzać fragmentami, bo to kompletny dokument html i np. istotny jest doctype czy rodzaj kodowania z sekcji head. mogę jednak przetwarzać operacjami: zrób jeden regexp - zamknij proces - zrób kolejny - zamknij proces - zrób kolejny - zamknij. zobaczymy co z tego wyjdzie, ale z tym ramem to fakt, coś w tym może być, zaraz potestuję wink.gif dzięki za pomoc
michaJlS
Zwiększ sobie limit ilości RAMu i czasu wykonywania skryptu, ew. odpal to z linii komend. Na windowsie też można.
kilas88
Cytat(michaJlS @ 21.06.2011, 17:49:50 ) *
Zwiększ sobie limit ilości RAMu i czasu wykonywania skryptu, ew. odpal to z linii komend. Na windowsie też można.

nie da rady

Niestety problemu dalej nie rozwiązałem. Mam ogromne dokumenty HTML i muszę je dzielić na kilka mniejszych. W jaki sposób to osiągnąć, może ktoś coś podobnego robił kiedyś? wink.gif
jaro87
Poza tym co już powiedzieli koledzy czyli
- zwiększ limit ramu (sprawdź czy na pewno go dobrze zwiększyłeś - WAMP ma pewnie kilka plików konfiguracyjnych więc musisz znaleźć ten prawidłowy)
- podziel jakoś ten plik na fragmenty (akapity, div?)

A moja rada to nie używaj do tego php tongue.gif Napisz program w C lub Javie, na pewno sobie poradzi z tym dużo lepiej:)
tehaha
Cytat
Niestety problemu dalej nie rozwiązałem. Mam ogromne dokumenty HTML i muszę je dzielić na kilka mniejszych. W jaki sposób to osiągnąć, może ktoś coś podobnego robił kiedyś?
Oprócz tego, że napisałeś, że "masz duuuży plik, który wykonuje się dłuuugo", to nie podałeś żadnych rzeczowych informacji więc skąd mamy wiedzieć jaka jest sytuacja, wrzuć kod php jakim to obrabiasz, wrzuć jeden przykładowy dokument html i wtedy możemy spróbować Ci pomóc bo tak to można się jedynie w zgadywanki bawić
tete
Musisz obrabiać partiami. Użyj Crona. Jak nie braknie ci pamięci, to przekroczysz czas wykonywania skryptu. Zwłaszcza jak masz serwer współdzielony.
zegarek84
Cytat(kilas88 @ 22.06.2011, 01:20:48 ) *
nie da rady

Niestety problemu dalej nie rozwiązałem. Mam ogromne dokumenty HTML i muszę je dzielić na kilka mniejszych. W jaki sposób to osiągnąć, może ktoś coś podobnego robił kiedyś? wink.gif

poszukaj w google pod hasłami SAX PHP.
Przy parsowaniu dużych plików XML korzystam z XML Parser (nie jest wczytywany cały plik na raz) - jednak musisz napisać sobie obiekt/klasę routera zdarzeniowego do przekierowywania na odpowiednie metody w danym momencie...

możesz skorzystać także z XMLReader - całość też możesz obudować jakimś interfejsem zdarzeniowym (zdarzeniówka chyba tu się najlepiej sprawdzi) i obrabiać tylko to co potrzebne... w sumie z niego nie korzystałem ale zdarzeniowy interfejs możesz oprzeć o metodę read i sprawdzać nodeType

jeśli przekraczasz pamięć, to nie możesz na raz wczytać całego dużego dokumentu - obie powyższe klasy umożliwiają Ci parsowanie dokumentu partiami i o ile dobrze to rozpiszesz sobie umożliwiają przeglądanie struktury drzewa ;]
kilas88
Cytat(jaro87 @ 22.06.2011, 07:34:23 ) *
Poza tym co już powiedzieli koledzy czyli
- zwiększ limit ramu (sprawdź czy na pewno go dobrze zwiększyłeś - WAMP ma pewnie kilka plików konfiguracyjnych więc musisz znaleźć ten prawidłowy)
- podziel jakoś ten plik na fragmenty (akapity, div?)

A moja rada to nie używaj do tego php tongue.gif Napisz program w C lub Javie, na pewno sobie poradzi z tym dużo lepiej:)

- nie da rady zwiększyć ramu - nie każę klientowi kupić lepszego hostingu, bo nie potrafię/nie chce mi się czegoś tam zrobić (w tym przypadku porcjować dane wejściowe)

- do operacji tekstowych podobno mistrzem jest Perl, ale tutaj też byłby problem z serwerem - poza tym aplikacja którą tworzę ma być odpalana raz na miesiąc, więc wydajność na drugim miejscu

Cytat(tehaha @ 22.06.2011, 10:32:58 ) *
Oprócz tego, że napisałeś, że "masz duuuży plik, który wykonuje się dłuuugo", to nie podałeś żadnych rzeczowych informacji więc skąd mamy wiedzieć jaka jest sytuacja, wrzuć kod php jakim to obrabiasz, wrzuć jeden przykładowy dokument html i wtedy możemy spróbować Ci pomóc bo tak to można się jedynie w zgadywanki bawić

- mam plik HTML z książką, który zajmuje powiedzmy 10 MB; to przepuszczam przez HTMLPurifier celem formatowania i wywalania/dodawania pewnych elementów i zonk

Cytat(tete @ 22.06.2011, 10:37:50 ) *
Musisz obrabiać partiami. Użyj Crona. Jak nie braknie ci pamięci, to przekroczysz czas wykonywania skryptu. Zwłaszcza jak masz serwer współdzielony.

- do tego też już doszedłem wink.gif

Cytat(zegarek84 @ 22.06.2011, 10:52:32 ) *
poszukaj w google pod hasłami SAX PHP.
Przy parsowaniu dużych plików XML korzystam z XML Parser (nie jest wczytywany cały plik na raz) - jednak musisz napisać sobie obiekt/klasę routera zdarzeniowego do przekierowywania na odpowiednie metody w danym momencie...

możesz skorzystać także z XMLReader - całość też możesz obudować jakimś interfejsem zdarzeniowym (zdarzeniówka chyba tu się najlepiej sprawdzi) i obrabiać tylko to co potrzebne... w sumie z niego nie korzystałem ale zdarzeniowy interfejs możesz oprzeć o metodę read i sprawdzać nodeType

jeśli przekraczasz pamięć, to nie możesz na raz wczytać całego dużego dokumentu - obie powyższe klasy umożliwiają Ci parsowanie dokumentu partiami i o ile dobrze to rozpiszesz sobie umożliwiają przeglądanie struktury drzewa ;]

piękna odpowiedź, właśnie tego szukałem / potrzebowałem - dzięki wielkie wink.gif
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.