Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Timery w PHP
Forum PHP.pl > Forum > PHP
patlysy
Witam,

Wiem, że ogólnie kod PHP interpretowany jest po stronie serwera a wynik wysyłany do klienta. Jednak potrzebuje jakiegoś wyzwalacza typu "wczytanie strony poprzez kliknięcie w link". Powiedźcie jednak czy istnieje jakakolwiek szansa by PHP ustawić prosty timer po stronie serwera, który cyklicznie będzie wykonywał jakąś akcję? Mówię tutaj także o sytuacjach kiedy przeglądarka jest np. zamknięta. Wiem, że jest to raczej nierealne ale wole się upewnić poprzez kontakt z bardziej "zaawansowanymi" osobami w PHP.

Pozdro
gothye
google ->> CRON
patlysy
Super. W przyszłości na pewno to wykorzystam. A tak z ciekawości. Cron jest procesem Uniksowym. A czy istnieje szansa cyklicznego odpalania żądanego skryptu na maszynie z zainstalowanym Windowsem? Widziałem, że są alternatywne programiki imitujące Crona dla Windowsa. Testowaliście czy działają poprawnie?
fander
Wystarczy użyć "Harmonogram zadań" w windowsie albo "Zaplanowane zadania".

Ja używam tego na serwerze Windows Serwer 2003 do wywoływania skryptu kopi zapasowej.
patlysy
Ok. Dzięki za odpowiedź.
piotr94
są też na niektórych hostingach dostępne gotowe cron'y, można też znaleźć w necie darmowe crony
patlysy
Nie chcę zakładać nowego wątku a moje kolejne pytanie w pewien sposób dotyczy też tego tematu. Proszę powiedźcie mi czy istnieje szansa ustawienia jakiegoś licznika ograniczającego czas wykonywania pętli? I nie chodzi mi tutaj o set_time_limit który zabije mi całą sesję. W pętli fgetem czytam dane z serwera ssh. Zdarza się jednak jednak, że serwer nie odpowiada (zła komenda albo brak znaku nowej linii itd) i pętla stoi na tym poleceniu. Czy można przerwać samą pętlę po określonym czasie?

Pozdro.
masiakla
Cytat(patlysy @ 4.09.2010, 13:52:01 ) *
Nie chcę zakładać nowego wątku a moje kolejne pytanie w pewien sposób dotyczy też tego tematu. Proszę powiedźcie mi czy istnieje szansa ustawienia jakiegoś licznika ograniczającego czas wykonywania pętli? I nie chodzi mi tutaj o set_time_limit który zabije mi całą sesję. W pętli fgetem czytam dane z serwera ssh. Zdarza się jednak jednak, że serwer nie odpowiada (zła komenda albo brak znaku nowej linii itd) i pętla stoi na tym poleceniu. Czy można przerwać samą pętlę po określonym czasie?

Pozdro.

Jedyna rzecz, która nachodzi mi na myśl to puszcze nie tego w oddzielnym wątku i pilnowanie ile trwa. Ewentualnie można zaimplementować samemu ssh'a na socketach i pilnować timeout, ale to krecia robota. Zaraz sprawdzę bo nie pamiętam dokładnie, ale tam chyba były jakieś różnice między cli/mod_php/cgi.

//edited:
Taki mały przykładzik:
  1. class Job {
  2. private $parentPID;
  3. private $childPid;
  4.  
  5. public function __construct(){
  6. $this->parentPID = getmypid();
  7. pcntl_signal(SIGCHLD, array($this, "dzieckoSignalHandler")); //ubijanie dzieci
  8. }
  9.  
  10. public function start(){
  11. if($this->childPid = pcntl_fork()) {
  12. echo "rodzic\n";
  13. for($i=0;$i<10;$i++){
  14. echo "czekanie na dziecko ". $i ."s\n";
  15. sleep(1);
  16. }
  17. if(!is_null($this->childPid)){
  18. posix_kill($this->childPid, 0);
  19. echo "dziecko ubite\n";
  20. }
  21. } else {
  22. //tu wykonujesz te swoje gmyrania
  23. sleep(8);
  24. echo "dziecko\n";
  25. sleep(20);
  26. echo "dziecko2\n";
  27. exit(0);
  28. }
  29. return true;
  30. }
  31.  
  32.  
  33. public function dzieckoSignalHandler($signo, $pid=null, $status=null){
  34. if(!pid){
  35. $pid = pcntl_waitpid(-1, $status, WNOHANG);
  36. }
  37.  
  38. if($pid > 0){
  39. $exitCode = pcntl_wexitstatus($status);
  40. }
  41. $pid = pcntl_waitpid(-1, $status, WNOHANG);
  42. $this->childPid = null;
  43. }
  44. }
  45.  
  46. $job = new Job();
  47. $job->start();

Rodzic czeka 10 sekund na wykonanie się dziecka, jeżeli ten się nie zmieści w czasie to go ubija bezczelnie. Można to tez zrobić ciutkę inaczej z wykorzystaniem pcntl_alarm();
zegarek84
fajny przykładzik niestety działa tylko na unixach winksmiley.jpg - jakoś wolę inne rozwiązanie na oderwanie procesu... które tutaj nie potrzebne... choć w sumie nawet ze względu na samo sleep na unixach jesli się pisze jakiegoś bocika ma przewagę - jeśli do nich się ograniczymy to PCNTL jak najbardziej by był wskazany...
Cytat(patlysy @ 4.09.2010, 13:52:01 ) *
Nie chcę zakładać nowego wątku a moje kolejne pytanie w pewien sposób dotyczy też tego tematu. Proszę powiedźcie mi czy istnieje szansa ustawienia jakiegoś licznika ograniczającego czas wykonywania pętli? I nie chodzi mi tutaj o set_time_limit który zabije mi całą sesję. W pętli fgetem czytam dane z serwera ssh. Zdarza się jednak jednak, że serwer nie odpowiada (zła komenda albo brak znaku nowej linii itd) i pętla stoi na tym poleceniu. Czy można przerwać samą pętlę po określonym czasie?

Pozdro.
Cytat(masiakla @ 5.09.2010, 18:32:22 ) *
...Ewentualnie można zaimplementować samemu ssh'a na socketach i pilnować timeout, ale to krecia robota....
dlaczego skoro wszystko jest w manualu??
http://pl2.php.net/manual/pl/function.fsockopen.php
fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )

Cytat
timeout

The connection timeout, in seconds.

Informacja: If you need to set a timeout for reading/writing data over the socket, use stream_set_timeout(), as the timeout parameter to fsockopen() only applies while connecting the socket.

jeden z komentarzy dla rozjaśnienia sprawy - a jest tam wiele ciekawych komentarzy winksmiley.jpg - wystarczy dostosować do swoich rozwiązań winksmiley.jpg
Here's a quick function to establish a connection to a web server that will time out if the connection is lost after a user definable amount of time or if the server can't be reached
masiakla
@zegarek84: hmmm, możliwe, że nie ruszy na windzie. W sumie nie pomyślałem, na winzgrozie ostatni raz pracowałem w php parę lat temu. Prawidłowo to powinno być wykonane bez użycia sleep, ale zrobiłem tak by było bardziej czytelne.
zegarek84
nie miałem na myśli różnicy w działaniu funkcji sleep [drobny niuans] a PCNTL i POSIX które nie są dostępne na platformie Windows...
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.