Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Funkcja Sleep, Zamiast corn
xamrex
post 18.08.2010, 14:38:29
Post #1





Grupa: Zarejestrowani
Postów: 267
Pomógł: 1
Dołączył: 10.08.2007

Ostrzeżenie: (0%)
-----


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ą?

Ten post edytował xamrex 18.08.2010, 14:40:58
Go to the top of the page
+Quote Post
thek
post 18.08.2010, 14:42:29
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
xamrex
post 18.08.2010, 14:48:15
Post #3





Grupa: Zarejestrowani
Postów: 267
Pomógł: 1
Dołączył: 10.08.2007

Ostrzeżenie: (0%)
-----


Dzięki, zauważyłem, że ostatnio często mi pomagasz winksmiley.jpg
Go to the top of the page
+Quote Post
wookieb
post 18.08.2010, 14:51:49
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Maksymalny czas wykonywania skryptu oczywiście można wyłączyć poprzez ustawienie go na 0 i po kłopocie.


--------------------
Go to the top of the page
+Quote Post
Crozin
post 18.08.2010, 14:57:13
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ł?
Go to the top of the page
+Quote Post
zegarek84
post 18.08.2010, 16:45:26
Post #6





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
thek
post 18.08.2010, 23:19:17
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
zegarek84
post 19.08.2010, 10:06:26
Post #8





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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]

Ten post edytował zegarek84 19.08.2010, 10:11:24


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
thek
post 19.08.2010, 11:54:27
Post #9





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.05.2025 - 05:11