Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> uruchamianie pliku php co 30s bez właczonego kompa - na serwie
Norbit_24
post
Post #1





Grupa: Zarejestrowani
Postów: 163
Pomógł: 2
Dołączył: 7.03.2009

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


Witam

Czy jest jakakolwiek możliwość uruchomienia pliku php co 30s bez włączonego kompa - na hostingu? Bo w corn da się minimalnie co 1min..

corn nie spełnia moich wymagań (od 1min). Dokładnie potrzebne mi coś takiego, ze jak skrypt spełni jakiś tam warunek to żeby uruchamiał inny skrypt co 30s w określonym czasie. Musi się dać coś takiego zrobić. Tylko nie wiem jak;/



Bardzo proszę o pomoc. 
Z góry dzięki.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





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

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


Odpalasz skrypt raz i robisz w nim nieskończoną pętlę. W niej uruchamiasz ten drugi skrypt. Mierzysz czas jego działania. Następnie usypiasz skrypt na 30 - czasWykonywniaSię sekund. Problem mógłby się pojawić jeżeli ten drugi skrypt mógłby się wykonywać więcej niż 30 sekund, a wymagane byłoby bezwzględne uruchamianie co 30 sekund - niestety PHP jest jednowątkowy, więc ominięcie tego mogłoby być problematyczne.

  1. <?
  2.  
  3. while (true) {
  4. $start = microtime(true);
  5. //wywolanie drugiego skryptu
  6. $elapsedTime = microtime(true) - start();
  7.  
  8. $sleep = 30 - $elapsedTime;
  9.  
  10. if ($sleep > 0) {
  11. usleep($sleep);
  12. }
  13. }
Go to the top of the page
+Quote Post
zegarek84
post
Post #3





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

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


Cytat(phpion @ 22.01.2010, 10:36:36 ) *
Uruchom sobie ten kod i zobacz co dostaniesz w wyniku:
  1.  
  2. while (TRUE) {
  3. echo date('H:i:s').'<br>';
  4.  
  5. sleep (5);
  6. }

Skrypt chodzi przez 30 sekund i dokonuje przestoju na 5 sekund po każdym przebiegu. Jeżeli jako limit czasowy dasz 60, a jako przestój 30 to uzyskasz to, co chcesz.

wszystko ładnie i pięknie ale... no błędy się zdarzają ;) - dobrze nakierowujesz ale sam tego skryptu nie uruchomiłeś ;)...
skrypt będzie się wykonywał 30 sekund, ale "pracował" o wiele dłużej ;), sleep wstrzymuje wykonywanie skryptu o zadaną ilość sekund (usypia go) - z gostkiem się umówiłeś, że za 10h pracy zapłacisz mu tyle a tyle, on się zmęczył i chce się zdrzemnąć ;) - swoje potem musi odpracować ;) [głupi przykład ;p]...

i tu właśnie podaje się w sleep parametr po jakim czasie skrypt coś ma zrobić - odnośnie tematu... [pasuje sobie liczyć ile w sumie skrypt "spał" i odejmować od całości czasu by znać czas kiedy się zakończy by samemu go zakończyć a nie padł na zawał i nie po dokańczał niektórych procesów - ale do tego wrócę o co mi chodzi ;)
Cytat(Crozin @ 23.01.2010, 01:17:00 ) *
...niestety PHP jest jednowątkowy, więc ominięcie tego mogłoby być problematyczne...

więc trzeba odpalić kolejne wątki ;) - w sumie to nie takie trudne - ale pasuje pomyśleć jak nad nimi zapanować ;)...

ok... jak odpalić kolejny wątek?? - albo skrypt którego nie chcemy potem nadzorować - wiemy że go uruchomiliśmy i to nam wystarczy (w tamtym skrypcie uruchomionym można zadbać o komunikaty choćby do pliku o wykonaniu "misji")...

jest funkcja ignore_user_abort, która nam trochu może pomóc - a czy przy zerwaniu połączenia przez skrypt jest konieczna to nie pamiętam ;p - dawno jeden test zrobiłem - taki mały cron ale z poziomu php który odpalał sam siebie gdy zbliżał się do "śmierci" i po drodze wykonywał inne operacje - akurat pierwsza wersja była odpalana z przeglądarki i limity ustawione były tak, by było widać procesy i zmiany w nadpisywanych plikach okresowo, potem skrypt sam siebie i inne uruchamiał - i w jednym miejscu miałem zonka bo procesów się narobiło ^^ (ale odbiegam od tematu - wracajmy)...

jeszcze nie wymieniłem wszystkich potrzebnych funkcji ale wcześniej... jak się pomysli kiedy proces sam siebie ma zlikwidować można iść na przód i...

(to było robione w celach "edukacyjnych" - może mi się kiedyś przyda - i pewnie dało się lepiej to obmyśleć ale mi chodziło tylko o ideę czy się da ;p) jest potrzebna np funkcja fsockopen - przy jej pomocy pobierzemy same nagłówki skryptu który chcieliśmy uruchomić i od razu zamykamy połączenie ;) - lub pierwszy znak - chcemy tylko odpowiedź - wady - adres musi być http lub inny ale pełny ;p...

dylematy i pytania??
ale zanim dostaniemy odpowiedź drugi skrypt swoje musi zrobić - czy musimy czekać aż się cały wykona??
nie ;)

ustawiamy odpowiedź na początku, nagłówki z close (jeśli ktoś chciałby przez przeglądarkę zainicjować) i wysyłąmy odpowiedź zanim skrypt skończy się wykonywać - zanim zacznie się robić to co on miał zrobić...
tu taki głupi przykłąd skryptu który wysyła odrazu "bzdurną" odpowiedź:

  1. ini_set('Content-Type','text/html; charset=utf-8');
  2.  
  3. echo 222;
  4.  
  5. header('Content-Type: text/html; charset=utf-8');
  6. header('Connection: close');
  7. header('Content-Language: pl');
  8. header('Content-Length: '.ob_get_length());
  9. header('Pragma: public');
  10. header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
  11. header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
  12. header('Cache-Control: no-store, no-cache, must-revalidate'); // HTTP/1.1
  13. header('Cache-Control: pre-check=0, post-check=0, max-age=0'); // HTTP/1.1
  14. header ('Pragma: no-cache');
  15. header('Expires: 0');
  16. flush(); // tu już nie pamiętam o co chodziło ale ten flush niestety trzeba wymusić bo nie zawsze działał poprawnie - dlatego powtórzenie podobnych funkcji ;p
  17.  
  18. /* tutaj chulaj duszo piekła nie ma ;) - róbta co chceta - nawet ignore_user_abort(true); nie jest tu już potrzebny ;p
  19. ale zadbajcie o jakieś komunikaty, kontrolę przez zapisywanie zdarzeń gdzieś - nie wykonało się poprawnie to trzeba powtórzyć ;p */


a przykładu z fsockopen to chyba nie muszę pokazywać ;p - choć jeśli chcecie to prościej będzie curl ;p - równie dobrze można file_get_contents ;p

UP @phpion - właśnie kończę pisać posta a w skrypcie na tyle często jest to sleep, że on dalej "pracuje" - a raczej "leniuchuje" bo od razu odpoczywa ;) - ale ideę słuszną pokazałeś ;)

ps. nie może to być nieskończona pętla ;) - trzeba kontrolować zakończenie skryptu bo jeśli on jest naglę przerywany z powodu przekroczenia czasu wykonywania to niejednokrotnie nie zakończy kilku rzeczy i może być co innego niż my się spodziewaliśmy przy ostatniej dostępnej a przerwanej pętli... pasuje zliczać czas wykonywania ze sleep, gdzieś podawać na zewnątrz "kontrolkę" np do pliku, że skrypt dalej chodzi i uruchomi się np. o tej i tej - więc próba uruchomienia jego kopii np. przed ta godziną niech po prostu zakończy działanie skryptu i inne "pierdułki" - i tym oto sposobem można napisać pseudo crona w samym php ;) - nadzorowanego np. dodatkowo jeszcze przez crona czy coś nei wyłączyło działania naszego skryptu...

a i ważne - pasuje dać jeszcze w skrypcie jakąś kontrolkę dzięki której moglibyśmy przerwać działanie skryptu ;p... np tworząc jakiś plik ;) - po prostu niech skrypt sprawdza czy plik jest czy go nie ma - jak jest lub w drugą stronę - od upodobań - to niech się wyłączy ;)


to jest takie obejście na "około" ale jakby nie było na przeprowadzonych testach działało... w tym temacie podajecie lepsze rozwiązania niż kiedyś widziałem temat o uruchamianiu co 5s albo coś w stylu crona w php -widziałem coś w stylu samego while(true){coś rób} bez sleep - przecie to by zżarło maszynę ;p

i podsumowanie:
Cytat(phpion @ 22.01.2010, 10:36:36 ) *
Uruchom sobie ten kod i zobacz co dostaniesz w wyniku:
  1.  
  2. while (TRUE) {
  3. echo date('H:i:s').'<br>';
  4.  
  5. sleep (5);
  6. }

Skrypt chodzi przez 30 sekund i dokonuje przestoju na 5 sekund po każdym przebiegu. Jeżeli jako limit czasowy dasz 60, a jako przestój 30 to uzyskasz to, co chcesz.

jeśli tak to ma być...
...to raczej powinno być tak:
  1. /* na starcie coś robisz */
  2. sleep (30);
  3. /* znowu wywołujesz ten skrypt co na starcie */
  4. // bez żadnego while ;)


a wyżej podałem bez szczegółów ogólnikowo przepis na coś ala cron ale w php ;)

Ten post edytował zegarek84 23.01.2010, 04:04:30
Go to the top of the page
+Quote Post

Posty w temacie
- Norbit_24   uruchamianie pliku php co 30s bez właczonego kompa - na serwie   22.01.2010, 09:38:09
- - phpion   Odpalasz CRONem co 1 minutę, a wewnątrz skryptu pu...   22.01.2010, 09:44:57
- - Norbit_24   Wtedy skrypt będzie się uruchamiał co 30s? A jak b...   22.01.2010, 10:23:34
- - phpion   Uruchom sobie ten kod i zobacz co dostaniesz w wyn...   22.01.2010, 10:36:36
- - Norbit_24   Aha, teraz rozumiem.. Dzięki.. A czy jest możl...   22.01.2010, 22:51:10
- - marcus753   Ja bym to zrobił prostolinijnie czyli ustawił bym ...   22.01.2010, 23:49:49
- - Crozin   Odpalasz skrypt raz i robisz w nim nieskończoną pę...   23.01.2010, 01:17:00
|- - zegarek84   Cytat(phpion @ 22.01.2010, 10:36:36 )...   23.01.2010, 03:49:43
|- - phpion   Cytat(zegarek84 @ 23.01.2010, 03:49:4...   23.01.2010, 11:28:27
- - Crozin   Normalnie jakbym widział post theka PHP jest jed...   23.01.2010, 11:21:24
- - zegarek84   dobra dobra - włącz sobie tworzenie przy tym i us...   23.01.2010, 22:44:44
|- - phpion   Cytat(zegarek84 @ 23.01.2010, 22:44:4...   24.01.2010, 12:28:04
|- - zegarek84   Cytat(phpion @ 24.01.2010, 12:28:04 )...   24.01.2010, 20:56:46
|- - phpion   Cytat(zegarek84 @ 24.01.2010, 20:56:4...   25.01.2010, 08:05:59
- - zegarek84   do puki wczoraj nie wyłączyłem laptopa gdyż robiłe...   25.01.2010, 12:19:44
- - phpion   Dobra, ja się poddaję. 444 pliki powiadasz - ciek...   25.01.2010, 12:57:50
|- - zegarek84   Cytat(phpion @ 25.01.2010, 12:57:50 )...   26.01.2010, 18:59:35
|- - phpion   Cytat(zegarek84 @ 26.01.2010, 18:59:3...   27.01.2010, 09:37:09
- - zegarek84   znalazłem kilka odpowiedzi ;) - nie było problemów...   27.01.2010, 12:09:28
- - phpion   Dzięki za wyczerpującą wypowiedź. Warto mieć na uw...   27.01.2010, 12:19:07
- - zegarek84   właśnie na tej zasadzie robiłem swojego pseudo cro...   27.01.2010, 12:29:49


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

 



RSS Aktualny czas: 5.10.2025 - 13:58