Gameserver Online/Offline Status

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Gameserver Online/Offline Status

    Hallo,

    ich bins mal wieder :) Ich habe da ein kleines Problem und kann mir selbst nicht erklären warum. Und zwar versuche ich via php den Online Status eines Gameservers ab zu fragen. Soweit klappt das auch ganz gut. Nur leider muss er nicht nur einen Server abfragen sondern alle die die in der Datenbank sind.

    Dies klappt auch soweit nur leider sind die Ladezeiten recht lange. bei 12 Servern in der Datenbank braucht er alleine 5-10 Sekunden bis er die Seite geladen hat. kommentiere ich die Funktion aus lädt die Seite wieder so wie sie soll.

    Hier mal mein Code


    Source Code

    1. $x = 0; while ($row=$db->fetch_array($result)) {
    2. $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    3. socket_connect($socket, $row["gameserver_ip"], $row["gameserver_port"]);
    4. // http://developer.valvesoftware.com/wiki/Server_queries#A2A_PING
    5. socket_write($socket, "\xFF\xFF\xFF\xFF\x69");
    6. sleep(1); // verbesserungswürdig ;)
    7. if (@socket_read($socket, 5) == "\xFF\xFF\xFF\xFF\x6A") {
    8. $gameserverliste[$x]['game_statu'] = '<img src="resurces/_icons/teamspeak/online.png" /> <span style="font-size:9px; color:green;">(Online)</span>';
    9. }else{
    10. $gameserverliste[$x]['game_statu'] = '<img src="resurces/_icons/teamspeak/offline.png" /> <span style="font-size:9px; color:red;">(Offline)</span>';
    11. }
    12. socket_close($socket);
    13. $x ++;
    14. }
    Display All
  • Jan Thurau sagt es richtig. Hier ein kleiner Anreiz wie man es mit Redis realisieren würde. (klappt natürlich auch analog zu MySQL)

    Die Webseite fragt jeden Server nach seinem Status:

    Source Code

    1. $status = new ServerStatus('server.hanspeter.org');
    2. echo $status->getStatus();


    Die Antwort ist immer der zuletzt bekannte Status. Der Status wird irgendwo gespeichert.
    Jedes mal wenn nach dem Server Status gefragt wird, wird der Eintrag in eine Queue eingetragen um aktualisiert zu werden.
    Stelle auf jeden Fall sicher, dass diese Queue nur einmalig abgearbeitet wird.

    Diese Queue wird dann von einem Cronjob abgearbeitet

    Source Code

    1. $queue = new ServerStatusQueue();
    2. foreach($queue->getList() as $server) {
    3. $status = new ServerStatus($server);
    4. $status->runUpdate();
    5. }



    Hier ein paar Klassen zum Einstieg (~Pseudocode)

    Source Code

    1. class ServerStatus {
    2. protected $server = '';
    3. public function __construct($server) {
    4. $this->server = $server;
    5. }
    6. protected function getCacheKey() {
    7. return 'serverstatus:';
    8. }
    9. public function getStatus() {
    10. $queue = new ServerStatusQueue();
    11. $queue->increase($this->server);
    12. $cachekey = $this->getCacheKey().$this->server;
    13. return Redis::get($cachekey);
    14. }
    15. protected function runUpdate() {
    16. $status = telnet($this->server);
    17. $cachekey = $this->getCacheKey().$this->server;
    18. Redis::set($cachekey, $status);
    19. return $status;
    20. }
    21. }
    22. class Queue {
    23. protected function getCacheKey() {
    24. return 'queue:'.get_class($this);
    25. }
    26. public function increase($value) {
    27. $cachekey = $this->getCacheKey();
    28. register_shutdown_function(function() uses ($cachekey, $value) {
    29. Redis::zincrby($cachekey, $value, 1);
    30. });
    31. }
    32. public function getList() {
    33. return Redis::zrevrangebyscore($this->getCacheKey());
    34. }
    35. }
    36. class ServerStatusQueue extends Queue {
    37. }
    Display All