Cytat(phpion @ 22.01.2010, 10:36:36 )

Uruchom sobie ten kod i zobacz co dostaniesz w wyniku:
while (TRUE) {
}
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ź:
ini_set('Content-Type','text/html; charset=utf-8');
header('Content-Type: text/html; charset=utf-8'); header('Content-Language: pl'); header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); // HTTP/1.1 header('Cache-Control: pre-check=0, post-check=0, max-age=0'); // HTTP/1.1 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
/* tutaj chulaj duszo piekła nie ma ;) - róbta co chceta - nawet ignore_user_abort(true); nie jest tu już potrzebny ;p
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:
while (TRUE) {
}
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:
/* na starcie coś robisz */
/* znowu wywołujesz ten skrypt co na starcie */
// bez żadnego while ;)
a wyżej podałem bez szczegółów ogólnikowo przepis na coś ala cron ale w php ;)