Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Skrypt działający non stop
Forum PHP.pl > Forum > PHP
keypax
Cześć.
Robię skrypt w php, który ma mniej więcej taką budowę:
  1. <?
  2. for($i=1;$i<=999999999;$i++)
  3. {
  4. //jakieś komendy do wykonania
  5. usleep(100000); - zatrzymuje skrypt na 100 milisekund
  6. }
  7. ?>


Chodzi o to, że jak odpalę skrypt w putty to wszystko działa dobrze, dopóki nie wyłączę putty. Wtedy skrypt przestaje działać.
Chciałbym móc mieć możliwość odpalenia skryptu tak, aby działał w tle niezależnie od tego czy mam włączone putty czy nie.

Próbowałem zrobić z tego demona i w "start" mojego skryptu znajdującego się w /etc/init.d/ podać:
Kod
start() {
  php "../../home/www/skrypt.php"
}


Wykonanie polecenia:
Kod
/etc/init.d/mojdemon start

zadziałało w połowie, ponieważ skrypt zaczął się wykonywać, lecz czekał na zakończenie wykonywania skryptu php. Po wyłączeniu putty skrypt przestał działać.

Czy ma ktoś jakieś propozycje jak to zrobić? Chodzi o to, żeby skrypt php był uruchomiony cały czas.

System to gentoo.
zegarek84
może za bardzo nie namieszam choć może już nie ta pora i nie ten stan upojenia ;p by odpowiadać ;p
Cytat(keypax @ 9.09.2010, 00:40:04 ) *
Chodzi o to, że jak odpalę skrypt w putty to wszystko działa dobrze, dopóki nie wyłączę putty. Wtedy skrypt przestaje działać.
Chciałbym móc mieć możliwość odpalenia skryptu tak, aby działał w tle niezależnie od tego czy mam włączone putty czy nie.
sleep a max_exexution_time [jak się to pisze to się pisze ;p] to 2 różne sprawy ;p [znalazłem coś o putty ale za szybko zgubiłem i w tym stanie drugi raz dziś nie znajdę ;p]

w sumie a pro po sleep na tym forum sobie za wiele tematów kontrowersynych nie przypominam [może za krótko jestem lub za mało czytam] ale większość tyczyła się windows vs linux i w zasadzie na bank większość z tych co pamiętam to uczestniczyłem w nich ;p -> w pewnych blogach podawali jako bug sleep'a, że działa w nieskończoność [bzdura!!!], w innych miejscach, że nie działa jak trzeba [w skrócie piszę - gdyż fakt - na winzgrozie to jest bug sposób dziaąłnia sleep - w manualu php nawet tak napisali pod bugami...]... na to co jestem dziabnięty już za wiele może nie wytłumaczę - ale po wyjściu z sleep nawet na unixie [gdzie to niby w nieskończoność dział sleep - bzdura!!!] gdy skrypt dalej się wykonuje po przekroczeniu max exekution time [jak zwał tak zwał ;p] skrypt zostanie przerwany [jak śpisz to nic nie robisz ;p - a propo temat co zaraz go dam ;p]... więc nie ma prawa bytu w nieskończoność [chyba, że będziesz resetował licznik czasu wykonania skryptu - ale w tamtytm temacie bodajrze było napisane jak - zreszta manual nie gryzie ;p]:



Cytat(keypax @ 9.09.2010, 00:40:04 ) *
  1. <?
  2. for($i=1;$i<=999999999;$i++)
  3. {
  4. //jakieś komendy do wykonania
  5. usleep(100000); - zatrzymuje skrypt na 100 milisekund
  6. }
  7. ?>
przeczytaj cały jeśli na prawdę to Cię interesuje...
uruchamianie pliku php co 30s bez właczonego kompa - na serwie
yevaud
najlatwiej uzyc programu screen i ominac problem winksmiley.jpg

chyba optymalnym rozwiazaniem jest http://pear.php.net/package/System_Daemon
http://kevin.vanzonneveld.net/techblog/art...daemons_in_php/

mozesz tez zjesc to widelcem jak na unixowca przystalo winksmiley.jpg http://php.net/manual/en/function.pcntl-fork.php
keypax
zegarek84: ledwo cokolwiek zrozumiałem z Twojego postu. max_exexution_time jak zmiany w samym pliku php.ini są dobre. Skrypt się wykonuje odpowiednio długo, jeżeli mam po prostu go odpalonego w putty.
yevaud: dziękuję za linki. Jutro rano jak wstanę to je obadam.
zegarek84
łałć - za dużo piw wczoraj ;p... przyznaję, że nie zrozumiałem do końca pytania choć pod wskazanym linkiem znalazłbyś inne rozwiązanie... oczywiście skoro pracujesz na unix'ie i jeśli na pewno skrypt nie będzie na windowsie pracował to najprostsze rozwiązanie jest to co wskazał yevaud
Cytat(yevaud @ 9.09.2010, 02:42:28 ) *
mozesz tez zjesc to widelcem jak na unixowca przystalo winksmiley.jpg http://php.net/manual/en/function.pcntl-fork.php

ale schematycznie spróbuje może opisać jak ja to alternatywnie robię...

na początku pliku dla bezpieczeństwa dobrze dać komendę ignore_user_abort [np. jakbyś chciał skrypt zastartować przeglądarką i zamknąć stronę lub inaczej skryptami np. emulującymi przeglądarkę...]

w następnym etapie zanim cokolwiek zrobisz w tym skrypcie co ma być oderwanym procesem wyślij pustą dosłownie odpowiedź lub jakąkolwiek treść z nagłówkami zamykającymi połączenie [czyli minimum nagłówków do wysłania to header('Connection: close'); oraz liczba znaków treści wiadomości czyli np. header('Content-Length: '.ob_get_length());]

oczywiście aby wcześniej te nagłówki wysłać musisz skorzystać z konstrukcji:
  1. //nagłówki i ewentualny komunikat jeśli sobie życzysz...
  2.  
  3. // RESZTA SKRYPTU CO ROBI DOKŁADNIE CO CHCESZ
  4. // co do tych 3 razy flush to możesz w manualu zerknąć dlaczego tak...


oczywiście aby kontrolować ten oderwany proces [by np. go zakończyć] musisz gdzieś sprawdzać panujące na zewnątrz warunki [czy to w bazie... lub czy istnieje dany plik itd.] - ale nie możesz tego oprzeć o sesję pracującą na plikach [chyba, ze masz ją na bazę...]

w tym temacie co Ci wczoraj podałem o tym pisałem dokładnie w tym poście:
http://forum.php.pl/index.php?s=&showt...st&p=704649

keypax
Dzięki wszystkim za odpowiedzi.
Okazało się, że w gentoo wystarczy użyć polecenia:
Kod
screen

a następnie odpalić nasz skrypt np:
Kod
php /home/www/skrypt.php


Po wyłączeniu putty skrypt działa w tle smile.gif
(jak na razie winksmiley.jpg)
atominium
startem też się da smile.gif.Zajrzyj do man.
Dawało się jakiś znacznik chyba & albo $ i skrypt szedł w tle smile.gif.
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.