Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jak ominąć maksymalny czas wykonywania skryptu
Forum PHP.pl > Forum > Przedszkole
Asver
Witam.
Na wstępie - wiem że na tym forum jest kilka tematów z tym związanych, jednak nie mogę znaleźć żadnego, choć nie mało wiedzy z nich zaczerpnąłem wczoraj w nocy.

Zrobiłem sobie skrypcik do sprawdzania pozycji słów kluczowych wielu stron, ich site w google, ilości linków w yahoo, sprawdzania czy dodane wpisy w katalogach istnieją i czy są zaindeksowane, wpisuje to wszystko to ładnej bazy danych, ja sobie moge z panelu to wyświetlać w fajnych tabelkach... ogólnie robi za mnie masę roboty.
Żeby nie obrazić G. masą zapytań jakie ślę do niego, po każdym zapytaniu robię sleep(3). To implikuje problem przekroczenia maksymalnego czasu działania skryptu. Rozwiązałem wstawiając metatag refresh który odświeża skrypcik żaglując parametrami w linku.
Wszystko działa tak pięknie, że aż łzy mi do oczu nabiegają ze szczęścia, jednak do jego pełni pozostaje jeden szkopuł - aby skrypcik wywoływany był codziennie
bez udziału mojej woli.

Ku mojej rozpaczy, wklepanie do crona powoduje jeno jednorazowe wykonanie skryptu, bez odświerzania....

Proszę o radę, jak to zrobić, aby w cron uruchamiał skrypcik i ten leciał aż się nie skończy...

Wave
w shellu nie masz metatagów.
nieskończona pętla while(1) { } i sleep(3000) - 3 sekundy ?
no i set_time_limit(0);
Asver
Cytat(Wave @ 17.06.2010, 20:50:37 ) *
w shellu nie masz metatagów.

Przeczuwałem tą odpowiedź....

Cytat(Wave @ 17.06.2010, 20:50:37 ) *
nieskończona pętla while(1) { } i sleep(3000) - 3 sekundy ?

Sleep(3) - to są 3 sekundy. Jest jeszcze usleep w mikrosekundach, ale nie jest mi potrzebny raczej...
A co do nieskończonej pętli, to czy przypadkiem w cronie też nie ma ograniczeń czasowych wykonywania skryptu? W ogóle się na tym całym cronie, powłoce itd nie znam... :/
Cytat(Wave @ 17.06.2010, 20:50:37 ) *
no i set_time_limit(0);

Nie mam dostępu do ustawień php.
Spawnm
set_time_limit(0); nie dajesz w ustawieniach php tylko na początku kodu , zobacz w manualu smile.gif
thek
Jeśli masz dostęp do cron to w zasadzie nie masz problemu. Cron to harmonogram zadań. Jeśli ustawisz mu wykonywanie się co minutę (najmniejszy możliwy odstęp czasowy dla zadań cron) - będzie wykonywał skrypt co minutę. Wtedy nawet limit czasu na 30 sekund nie będzie uciążliwy.
Co do set_time_limit(0) to ustawia się to na starcie skryptu. Jeśli jednak ma całość chodzić w kółko, to jest rozwiązanie jedno, ale średnio bezpieczne. Wywoływanie skryptu rekurencyjnie. Uruchamiasz skrypt, robisz coś, każesz mu wywołać samego siebie a pierwszego killujesz. Po drodze możesz ustawić sleepa jakiego chcesz i oczywiście user aborta musisz odpowiednio ustawić. Dzięki temu proces będzie wiecznie działał. Dzieje się tak, ponieważ wywołanie potomne nie jest zależne od poprzednika jeśli dobrze sprawę przemyślisz i zakończenie exitem rodzica nie wpływa na potomka, który w tym czasie mógł wywołać już nawet swoje kolejne "dziecko". To są jedne z "niebezpiecznych" wariantów skryptów, gdyż nie działa na nie nic innego jak ubijanie z poziomu konsoli. Inaczej nie da się ich zatrzymać. Stąd pisanie takich należy mocno obwarować warunkami wykonywalności, dobrze wszystko przemyśleć i jednak co jakiś czas zatrzymywać oraz dać "odpocząć" serwerowi by za choćby 2-3 minuty znów go cronem wywołać. Są to świetne do działań w tle skrypty, ale potrafią "zabić" serwer, jeśli są pisane bez przemyślenia.
Asver
Ustawiłem sobie w pętli po sleepie set_time_limit(30) - śmiga, brzęczy i się błysko w cronie.
Coś nie chce mi się wierzyć jednak, aby to wystarczyło kiedy baza rozrośnie mi się do porządnych rozmiarów.
Puki co działa idealnie - dzięki.

Co do "wiecznego skryptu" - mega ciekawa i intrygująca koncepcja. Ale tak "wieczne" działanie, jak i wywoływanie co 10 min non-stop, nie są potrzebne - jedno sprawdzenie na dzień w zupełności wystarczy a z 4 sekundowym sleepem jestem w stanie w ciągu 24h sprawdzić grubo ponad 15k słów kluczowych, w zupełności mi wystarczy.
thek
Bo rozwiązania dopasowuje się zawsze do sytuacji. W większości przypadków prostych limit czasu to aż nadto. Gdy to nie wystarcza to cron najczęściej daje radę. Gdy niestety z jakichś przyczyn nie możemy sobie pozwolić na cronjobs (provider nie udostępnia, lub można je "rzadko" (rzadko jak dla naszych potrzeb winksmiley.jpg ) wywoływać to trzeba kombinować już na inne sposoby. A to set_time_limit, a to rekurencyjne wywołania będące okrojoną wersją tych "wiecznych", a to znów jakieś miksy z posyłaniem zadań do shella (konsola ma wyższy priorytet) smile.gif
Tu kłania się bardziej pomysłowość, znajomość różnych rozwiązań, funkcji i szczypta bezczelności winksmiley.jpg
Asver
Emm.... skrypcik śmiga cały czas. Jedno mnie martwi - choć mam w kodzie sleep(4) przy sprawdzeniu każdego z ok. 100 słów, sprawozdanie crona otrzymuje na maila w tej samej minucie w której skrypt ma się załączać.... - sleep nie działa w cronie czy co?
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.