Asver
17.06.2010, 19:38:34
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
17.06.2010, 19:50:37
w shellu nie masz metatagów.
nieskończona pętla while(1) { } i sleep(3000) - 3 sekundy ?
no i set_time_limit(0);
Asver
17.06.2010, 19:57:48
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
17.06.2010, 20:01:53
set_time_limit(0); nie dajesz w ustawieniach php tylko na początku kodu , zobacz w manualu
thek
17.06.2010, 21:04:17
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
17.06.2010, 21:51:34
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
17.06.2010, 22:14:53
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

) 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)

Tu kłania się bardziej pomysłowość, znajomość różnych rozwiązań, funkcji i szczypta bezczelności
Asver
25.06.2010, 21:19:12
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.