Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa do sprawdzania statusu serwera
Forum PHP.pl > Forum > PHP
Dominator
Witajcie
Napisałem sobie klasę do sprawdzania statusu serwera (włączony/wyłączony). Możecie go ocenić? (pod względem czy jest napisany poprawnie).

  1. <?php
  2.  
  3. Class Status
  4. {
  5. public function Get($ip, $port)
  6. {
  7. global $msg;
  8. $this->ip = $ip;
  9. $this->port = $port;
  10. $this->msg = $msg;
  11. $connection = fsockopen($this->ip, $this->port, $errorNo, $errorStr, 3);
  12. if($connection)
  13. {
  14. $this->msg = "Server is UP";
  15. }
  16. else
  17. {
  18. $this->msg = "Server is DOWN";
  19. }
  20. }
  21. public function Display()
  22. {
  23. echo $this->msg;
  24. }
  25. }
  26.  
  27. $pub = new Status();
  28. $pub->Get("25.135.219.119","25565");
  29. $pub->Display();
  30.  
  31. ?>
widmo_91
1. Daj @ przed fsockopen bo jak sie nie uda polączenie to przewie Ci skypt
2. Zadeklaruj zmienne ip, port, msg w klasie przed ich użyciem.
3. Zamiast Get bardziej by pasowała nazwa Set
4. Co to za zwyczaj nazywania metod z wielkich liter?
5. Co to za instrukcja global $msg bo nie rozumiem inicjatywy
Dominator
Cytat(widmo_91 @ 23.07.2013, 16:26:38 ) *
1. Daj @ przed fsockopen bo jak sie nie uda polączenie to przewie Ci skypt
2. Zadeklaruj zmienne ip, port, msg w klasie przed ich użyciem.
3. Zamiast Get bardziej by pasowała nazwa Set
4. Co to za zwyczaj nazywania metod z wielkich liter?
5. Co to za instrukcja global $msg bo nie rozumiem inicjatywy


1. Zrobione
2. Czemu? W PHP na wiki jest napisane "Zmienne w PHP nie wymagają deklaracji"
3. Zrobione
4. A nie wiem, z tutoriali pewnie biggrin.gif
5. Gdy nie dam global $msg to będę miał Notice: Undefined variable: msg in bla bla
widmo_91
2. To że nie wymagają nie znaczy, że nie warto tego robić bo później klasa się rozrośnie jak to zwykle bywa i będziesz szukał w której metodzie została zadeklarowana taka zmienna i co robi a jak zadeklarujesz to wszystkie będziesz miał w jednym miejscu
5. Ale po co Ci ona skoro i tak ją nadpisujesz później:
if($connection)
{
$this->msg = "Server is UP";
}
else
{
$this->msg = "Server is DOWN";
}

Wywal: global $msg; i $this->msg = $msg;

Na początkowym etapie nauki radzę na siłę unikać zmiennych globalnych.
Dominator
Cytat(widmo_91 @ 23.07.2013, 16:41:42 ) *
2. To że nie wymagają nie znaczy, że nie warto tego robić bo później klasa się rozrośnie jak to zwykle bywa i będziesz szukał w której metodzie została zadeklarowana taka zmienna i co robi a jak zadeklarujesz to wszystkie będziesz miał w jednym miejscu
5. Ale po co Ci ona skoro i tak ją nadpisujesz później:
if($connection)
{
$this->msg = "Server is UP";
}
else
{
$this->msg = "Server is DOWN";
}

Wywal: global $msg; i $this->msg = $msg;

Na początkowym etapie nauki radzę na siłę unikać zmiennych globalnych.


2. Zrobione, przemyślałem sobie i doszedłem do wniosku, że masz rację. Dzięki wink.gif
5. Usunąłem global + $this->msg = $msg i działa pięknie, dzięki jeszcze raz! biggrin.gif

Ogólnie rzecz biorąc, napisałem sobie drugi, taki sam skrypt. Według was - który lepszy?
Robiłem benchmark i różnica pomiędzy skryptami wynosi 0,000061.

Wersja 1:
  1. Class Status
  2. {
  3. public function Set($ip, $port = 80)
  4. {
  5. $this->ip = $ip;
  6. $this->port = $port;
  7. $connection = @fsockopen($this->ip, $this->port, $errorNo, $errorStr, 3);
  8. if($connection)
  9. {
  10. $this->msg = "Server is UP";
  11. }
  12. else
  13. {
  14. $this->msg = "Server is DOWN";
  15. }
  16. fclose($connection);
  17. }
  18. public function Display()
  19. {
  20. echo $this->msg;
  21. }
  22. public static function getmicrotime()
  23. {
  24. return array_sum(explode(' ', microtime()));
  25. }
  26. }


Wersja 2:
  1. Class Status
  2. {
  3. public function __construct($ip, $port = 80)
  4. {
  5. $this->Set($ip, $port);
  6. $this->Connect();
  7. }
  8. public function Set($ip, $port)
  9. {
  10. $this->ip = $ip;
  11. $this->port = $port;
  12. }
  13. public function Connect()
  14. {
  15. $con = @fsockopen($this->ip, $this->port, $errorNo, $errorStr, 3);
  16. if($con)
  17. {
  18. $this->msg = "+";
  19. }
  20. else
  21. {
  22. $this->msg = "-";
  23. }
  24. }
  25. public function Display()
  26. {
  27. echo $this->msg;
  28. }
  29. public static function getmicrotime()
  30. {
  31. return array_sum(explode(' ', microtime()));
  32. }
  33. }


Jakie macie uwagi?
rocktech.pl
Witam.

1. Nazwa klasy jest zbyt ogólna (czy używając tej klasy zobaczę obciążenie procesora na serwerze?)
2. Metoda Set() (ale co ..), jak już to użyj setterów setIP setPort
3. Connect() owszem można i tak ale niech Connect() wykonuje tylko operacje łączenia
4. Własność msg ma się nijak + - i, wyświetlaj (plus,OK,COOL,NICE) lub (minus,FAIL,BAD,WRONG) w zależności do statusu tu jest to wręcz zakazane

  1. <?php
  2.  
  3. class ServerConnectionStatus
  4. {
  5.  
  6. public $ip = null;
  7. public $port = null;
  8. public $active = false;
  9.  
  10. public function __construct($ip, $port = 80)
  11. {
  12.  
  13. $this->ip = $ip;
  14. $this->port = $port;
  15. }
  16.  
  17. public function check()
  18. {
  19. $con = @fsockopen($this->ip, $this->port, $errorNo, $errorStr, 3);
  20. if ( is_resource($con) ) {
  21. $this->active = true;
  22. } else {
  23. $this->active = false;
  24. throw new RuntimeException($errorStr);
  25. }
  26. }
  27.  
  28. public function isActive()
  29. {
  30. return $this->active;
  31. }
  32.  
  33. }


  1. $serverCStatus = new ServerConnectionStatus('localhost', 80);
  2. try {
  3. $serverCStatus->check();
  4. echo $serverCStatus->isActive() ? '+' : '-';
  5. } catch ( Exception $e ) {
  6. echo $e->getMessage();
  7. }
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.