Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Funkcja Sleep
Forum PHP.pl > Forum > Przedszkole
xamrex
Witam. Ostatnio napisałem skrypt, który dodaje newsy co 3 dni o 12.00
Oczywiście musiałem dodać to do crona.
Jednak nie działa to tak jak chce.

Zauważyłem, że w PHP jest ciekawa funkcja SLEEP.
Chciałbym dowiedzieć się jakie ona ma wady.
Jeśli dałbym taką pętlę
  1. for ($i, $i<99, $i++){
  2. mysql_query(insert into tabela values $wartosc);
  3. sleep(259200);}

Czy działało by to podobnie do crona? (zakładając, że uruchomiłbym skrypt o 12.00)
Jeśli $wartość jest pobierana z pliku to czy gdy w czasie pracy skryptu podmienię plik i zmienię treść zmiennej wartość to czy PHP będzie wrzucać do mysql wartość która jest podana w czasie uruchomienia skryptu czy tą nową?
thek
Sleep sobie może działać, ale zwróć uwagę, że istnieje coś takiego jak maksymalny czas wykonania skryptu. Możesz zatrzymać jego wykonanie na jakiś czas funkcją sleep, ale nie jest to liczone w dniach. Takie rozwiązanie nie zadziała po prostu.
xamrex
Dzięki, zauważyłem, że ostatnio często mi pomagasz winksmiley.jpg
wookieb
Maksymalny czas wykonywania skryptu oczywiście można wyłączyć poprzez ustawienie go na 0 i po kłopocie.
Crozin
Tak jak zauważył już @wookieb maksymalny czas wykonywania skryptu to nie przeszkoda, ale:

1. Wartość dla sleep powinna być obliczania dynamicznie. Obecnie jeżeli kod zawarty w pętli wykonuje się 25 sekund to pierwsze wywołanie odbędzie się o 12:00:00, następne o 12:00:25, następne 12:00:50, następne 12:01:15 itd.
2. Ten sposób jest do granic możliwości niewygodny. Serwer na sekundę padnie - potrzeba od nowa włączać skrypt. Chcesz coś zmienić w skrypcie - potrzeba od nowa go włączać.

No i najważniejsze pytanie: co Ci w cronie nie działa tak jabyś chciał?
zegarek84
Cytat(wookieb @ 18.08.2010, 15:51:49 ) *
Maksymalny czas wykonywania skryptu oczywiście można wyłączyć poprzez ustawienie go na 0 i po kłopocie.
jak to był raz jeden temat gdzie dowodziłem, że nie trzeba zmieniać maksymalnego czasu wykonania by sleep ustawić na np 1 godzinę - nawet podawałem linki do manuala, gdzie pisało, że to nie żaden bug a bugiem jest to jak reaguje na niego windows [gdzie sleep jest wliczany do czasu wykonywania]... co nie znaczy, że na innych systemach skrypt będzie działał w nieskończoność - fakt, że sleep tam nie jest wliczany do czasu wykonywania skryptu ale i procesor nie jest obciążony - gdy idzie dalej skrypt i jest np while(true) to to się maksymalnie wykona 30sekund [no chyba, że zmienimy ustawienia]...

coby sobie na bazie tego pseudo crona zrobić pasuje jeszcze zainteresować się funkcjami typu ignore_user_abord [jakoś tak się zwie] i czas wyliczać dynamicznie, gdzieś zapisywać co jakiś czasz, że skrypt działa coby móc kontrolować w tle [oderwany proces] i i jeszcze zaplanować, jak długo może maksymalnie skrypt nie dawać znaku życia - jeśli żyje procesu nie uruchamiamy, jak padnięty to odpalamy od nowa... oczywiście wartość pod sleep powinno wyliczać się dynamicznie... cron+sleep daje sporo możliwości.... a jeśli chcemy pozbyć się crona to pasowało by by na różnych serwerach monitorowały się skrypty i w razie potrzeby by ożywał taki proces...
thek
Owszem... Można ustawiać czas wykonania na 0, ale tylko gdy możesz go modyfikować poprzez dyrektywy lub funkcje php. A przecież nie wszystkie hostingi na to pozwalają tak jak nie na wszystkich jest dostępny cron, albo ma on limity w stylu raz na ileś minut.
To co wspomniał zegarek jest prawdą, ale tylko w przypadku windowsa i znów manual tutaj wyjaśnia to. Jedynie windows tak reaguje, że nie liczy czasu w uśpieniu do całkowitego czasu wykonywania. Najbezpieczniejszy wariant to użycie crona, a jeśli działania mają być częstsze niż minuta, to wspomniane uruchamianie skryptu i jego kontrola poprzez cron.
zegarek84
Cytat(thek @ 19.08.2010, 00:19:17 ) *
To co wspomniał zegarek jest prawdą, ale tylko w przypadku windowsa i znów manual tutaj wyjaśnia to. Jedynie windows tak reaguje, że nie liczy czasu w uśpieniu do całkowitego czasu wykonywania...
sprostowanie: pisałem ale inaczej - właśnie to w Windowsie czas uśpienia jest wliczany do całkowitego czasu wykonywania, na innych systemach nie...

przykład: na linux'ie maksymalny czas wykonywania skryptu wynosi 30s i nie mamy możliwości zmieniania tej wartości, skrypt wykonałby się w ułamku sekundy ale potrzebujemy, by pewną operację wykonał w dokładnie odliczonym czasie [zastosowanie - np. boty do jakiejś gry np. www], z obliczeń wynika, iż dana akcja ma być dopiero za 2min i 10s [czas ten obliczyliśmy na początku]... przekazujemy funkcji sleep coby reszta skryptu wykonała się po obliczonym czasie [ja preferuję tutaj oderwanie procesu od reszty i inny skrypt mógłby czuwać nad całością]... i reszta operacji jest wykonywana po tym czasie - za błąd było podawane, że skrypt wykonywał się 2min 10sekund i troszkę faktycznego czasu wykonywania skryptu przed i po sleep - podczas gdy w manualu jest wyjaśnione, że czas sleep nie jest błędem a błędem jest to, że windows przerwie taką operację wliczając do czasu wykonywania skryptu...

// EDIT
choć raz na pewnym hostingu dokładnie nie było wyjaśnione jak jest liczone obciążenie procesora [w kontekście sleep i manuala], niby przez czas wykonywania skryptu ale jak to tam liczyli nie było napisane - dla pewności zapodałem tam kilka skryptów i zadałem pytania - szczerze sama obsługa była zdziwiona, że skrypt został naliczony na ułamek sekundy podczas gdy wynik na ekranie widzieli co 10s [mimo iż wcześniej wszystko dokładnie tłumaczyłem] - oczywiście wynik był dla mnie satysfakcjonujący i jeszcze raz objaśniałem im, iż to nie jest błąd i podawałem różne linki także do manuala i do bugów [gdzie napisane jest, że to nie jest bug - bugiem jest to jak na windows proces jest przerywany]
thek
Mój błąd. Źle odczytałem i zegarek84 ma rację. Manual set_time_limit w wolnym tłumaczeniu:
Cytat
Funkcja set_time_limit() function dyrektywa konfiguracyjna max_execution_time wpływają jedynie na czas wykonywania samego skryptu. Czas będący aktywnością poza nim jak wywołania systemowe z użyciem system(), operacje na strumieniach, zapytania do bazy danych, itd. nie jest wliczany do maksymalnego czasu wykonywania się skryptu. Nie jest to prawdą dla Windows, który oblicza czas realny.
A co do sleep i usleep na windzie, to w jednym z komentarzy było podane, że mają pewną niedogodność. Jeśli set_time_limit jest ustawione na coś więcej niż 0 to potrafią zeżreć 50% mocy procka.
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.