Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z socketami
Forum PHP.pl > Forum > PHP
Shock8876
Witam! Mam taki oto prosty skrypt, który ma sprawdzać status serwera, i pobierać z niego dane (Uptime, gracze online):
  1. $info = chr(6).chr(0).chr(255).chr(255).'info';
  2. $sock = fsockopen('localhost', 7171, $errno, $errstr, 1);
  3.  
  4.  
  5. //show source request
  6. if($_REQUEST['action']=='source'){
  7. highlight_file(__FILE__);
  8. }
  9. else{
  10. if ($sock)
  11. {
  12. //writes the info gotten by sending the server packet.
  13.  
  14. fwrite($sock, $info);
  15. $data='';
  16.  
  17. while (!feof($sock))
  18. {
  19. $data .= fgets($sock, 1024);
  20. }
  21. fclose($sock);
  22.  
  23. //players online and max (ex. Players online: 24 / 100)
  24. preg_match('/players online="(\d+)" max="(\d+)"/', $data, $matches);
  25. echo 'on';
  26. echo '<br />Players: '.$matches[1].' / '.$matches[2];
  27.  
  28.  
  29. //Monster total (ex. Monsters: 23456)
  30. preg_match('/monsters total="(\d+)"/', $data, $matches);
  31. print '<br />Monsters: '.$matches[1].'';
  32.  
  33. //Uptime (Uptime: 23h 12m)
  34. preg_match('/uptime="(\d+)"/', $data, $matches);
  35. $h = floor($matches[1] / 3600);
  36. $m = floor(($matches[1] - $h*3600) / 60);
  37.  
  38. echo '<br />Uptime: '.$h.'h '.$m.'m'.'</p>';
  39. <ul>
  40.  
  41. </ul>';
  42. }
  43. else
  44. {
  45. echo 'off';
  46. }
  47. }


jest to skrypt do OTSa (otwartego serwera tibii). Błąd polega na tym, że czasami wyświetla dane normalnie:
  1. on
  2. Players: 2/1000
  3. Monsters: 2001
  4. Uptime: 3h 30m


a czasami poprostu takie cos:
  1. on
  2. Players: /
  3. Monsters:
  4. Uptime: 0h 0m
l0ud
Cóż... OTSy zdecydowanie nie słyną z nieskazitelnej jakości kodu i zdarza się, że serwer na takie zapytanie nie odpowie (i czasem się przy tym wywali). Może zadziałać też jakieś zabezpieczenie przed obciążeniem, które odrzuca zbyt częste żądania.

W tym przypadku czasem serwer nie zwraca nic. Połączenie się udaje, więc nie wyświetla Ci się 'off'. Można by dopisać sprawdzanie zwracanego ciągu (czy nie jest pusty) aby uniknąć takich sytuacji. ($data przed pierwszym preg_matchem)
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.