Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sprawdzenie czy uruchomiony jest inny skrypt
Forum PHP.pl > Forum > Przedszkole
Demoneos
Jak można sprawdzić w skrypcie A, czy uruchomiony jest inny skrypt B (może być uruchomiony np. przez crona)?
achill
najlepiej by było jakbyś podał jakiś przykład skryptu, który chcesz sprawdzić.

Ogolnie rzecz biorąc, mozna rozwiązać ten problem w trochę inny sposób - pewnie nie jest to w 100% to o co Ci chodzi ale prawidłowe wnioski same się nasuwają:

załózmy że skrypt B wykonuje kilka operacji, ktorych wynikiem jest nowa zmienna x.
zatem wystarczy , że sprawdzisz (za pomoca if/while isset itp) w lub przed skryptem A czy ta zmienna została zadeklarowana czy nie.
jesli skrypt A wykaże ze zmienna zoastala zadeklarowan to wniosek, że skrypt B sie wykonał.
jesli nie wykaże zmiennej, to skrypt B sie nie wykonał (oczywiście zakładając, że nie jest to wynikiem błedów)


batman
Na początku swojego działania skrypt A tworzy plik/zapisuje coś do bazy, a na końcu to usuwa. Skrypt B sprawdza, czy istnieje plik/wpis w bazie. Jeśli nie, to znaczy, że A nie pracuje, jeśli tak, wręcz przeciwnie. Dobrą praktyką jest ustalenie jakiegoś timeoutu dla pliku/wpisu w bazie, by uniknąć sytuacji, w której po awarii skryptu A, skrypt B będzie otrzymywał informację, że A cały czas pracuje.
phpion
@achill:
Pokaż może jak sprawdzić z poziomu skryptu A czy skrypt B zadeklarował jakąś zmienną. Chętnie bym to sobie zobaczył.

@batman:
A co w przypadku, gdy skrypt po drodze się wysypie i nie zdąży zdjąć założonej przez siebie "blokady"? Edit: Aj, nie doczytałem - wspominasz o timeoucie.

Ja to realizuję za pomocą zakładania blokad na pliki. Jeśli blokada jest założona to znaczy, że proces pracuje. W przypadku wysypania się skryptu z dowolnego powodu blokada samoczynnie się zdejmuje. Oto klasa Process:
  1. <?php
  2. /**
  3.  * Klasa monitorująca działanie procesu.
  4.  *
  5.  * @author Michał "phpion" Płonka
  6.  * @package Process
  7.  */
  8. class Process {
  9. /**
  10. * Plik, na podstawie którego określany jest status działania procesu.
  11. *
  12. * @var string
  13. */
  14. protected $file;
  15.  
  16. /**
  17. * Uchwyt pliku.
  18. *
  19. * @var resource
  20. */
  21. protected $handler = NULL;
  22.  
  23. /**
  24. * Konstruktor klasy.
  25. *
  26. * @param string $file Plik, na podstawie którego określany jest status działania procesu.
  27. */
  28. public function __construct($file) {
  29. $this->file = APPPATH.'process/'.(string)$file;
  30. $this->handler = fopen($this->file, 'w');
  31. }
  32.  
  33. /**
  34. * Rozpoczyna działanie procesu.
  35. *
  36. * Nakłada blokadę na plik.
  37. *
  38. */
  39. public function start() {
  40. if (is_null($this->handler)) {
  41. $this->handler = fopen($this->file, 'w');
  42. }
  43.  
  44. flock($this->handler, LOCK_EX + LOCK_NB);
  45. }
  46.  
  47. /**
  48. * Kończy działanie procesu.
  49. *
  50. * Zdejmuje blokadę z pliku.
  51. *
  52. */
  53. public function stop() {
  54. if (!is_null($this->handler) && is_resource($this->handler)) {
  55. flock($this->handler, LOCK_UN);
  56. fclose($this->handler);
  57. }
  58.  
  59. $this->handler = NULL;
  60. }
  61.  
  62. /**
  63. * Sprawdza czy proces jest uruchomiony.
  64. *
  65. * @return bool Zwraca TRUE gdy proces jest uruchomiony, FALSE w przeciwnym wypadku.
  66. */
  67. public function is_running() {
  68. return !flock($this->handler, LOCK_EX + LOCK_NB);
  69. }
  70.  
  71. const VERSION = '1.0';
  72. }

Klasa jest napisana pod Kohanę więc zmodyfikuj się konstruktor by przyjmował pełną ścieżkę, a nie tylko nazwę pliku. Have fun smile.gif
achill
w kwestii sprostowania phpionie

1) zaznaczyłem że sprawdzenie zmiennej nie da nam w 100% tego co chcemy ale pozwoli sprawdzić czy skrypt się wykonał (tu moj bład bo chodziło przeciez o te ktore się jeszcze wykonują).
2) mimo tej nieścislości zasada myslenia jest podobna i ja i batman i Ty próbowaliśmy sprawdzić coś co powstaje tylko gdy skrypt zostanie uruchomiony ( w tym punkcie chyba się ze mną zgodzisz, że zmienna ze skryptu B może byc dowodem na jego wykonanie)
3) "chciałbym to zobaczyć", owszem bez timeouta pewnie by to ładnie wyglądało - permanentne 'skrypt B działa' wink.gif ale czy nie wolno próbować?
phpion
Spoko, tylko że napisałeś, że chcesz to zrealizować za pomocą sprawdzenia w skrypcie B czy skrypt A zainicjował jakąś zmienną. Według mojej wiedzy nie ma możliwości odczytu zmiennych utworzonych przez inny (zupełnie odrębny) skrypt. Jedynym rozwiązaniem jest wykorzystanie jakiś współdzielonych zasobów (plik, baza danych). Dlatego napisałem, że chętnie bym zobaczył próbę odczytu zmiennej $x zadeklarowanej w skrypcie a.php przez skrypt b.php.
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.