Gameserver Online/Offline Status

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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


    Quellcode

    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. }
    Alles anzeigen
  • 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:

    Quellcode

    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

    Quellcode

    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)

    Quellcode

    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. }
    Alles anzeigen