Server "lagged" nach Socketbefehlen?!

BeaTBoxX

Erfahrenes Mitglied
Hallo zusammen,

ich habe fuer eine Page 2 Klassen gefunden, die mir ( in diesem Fall ) die Stati von 2 Gameservern liefern. Das ganze funktioniert mit Socketverbindungen.
Hier die Klasse fuer einen Counterstrike Source Server ( die andere fuer 1.6 funktioniert wunderbar)

Problem:
Ich rufe die Seite auf, und es funktioniert manchmal alles wie es soll.
Manchmal warte ich ewig auf das Laden der Seite und es tut sich nix.
Danach allerdings wenn ich danach einen anderen Link anklicke (der mit der Socketsache garnix zu tun haben muss) muss ich ewig auf einen Seitenaufbau warten.
Kein Time out passiert.. die Seite läd einfach ewig vor sich hin ?!

Kann jemand von euch mit diesen Symptomen was anfangen ?

Habe ich da irgendwas vergessen abzufangen?

Ein ...
Code:
 socket_set_timeout($this->fp, 3);

... ist gesetzt also, sollte die Klasse nach 3 Sekunden das ganze Abbrechen, dalls die Socketverbindung nicht funktioniert.



Hier mal die ganze Klasse:

Code:
<?php

/* === class_hlserver.inc ============================================= */

class sourceserver
{
   var $ip; // Variable für die IP
   var $port; // Variable für den Port
   var $fp; // Variable für das File-Handle (die Verbindung)
   
   // weitere Variablen
   var $serverinfo;
   var $playerlist;
   var $cvarlist;
   
   // unsere erste Funktion ist der Klassen-Konstruktor
   function hlserver($server_address=0)
   {
       // keine IP angegeben?
       if($server_address == 0)
       {
           $this->ip   = "80.190.205.125";
           $this->port = 27015;
       }
       else
       {
           // $server_address, bestehend aus IP und Port (ip:port) aufsplitten
           list($this->ip, $this->port) = explode(':', $server_address);
       }
   }
   
   // Verbindung zum Server aufbauen
   function connect()
   {
       // UDP Verbindung aufbauen
       if(!$this->fp = fsockopen("udp://".$this->ip, $this->port, $errno, $errstr, 3))
       {
           // Timeout setzen
           @socket_set_timeout($this->fp, 3);
           die(sprintf("Verbindung zu %s:%s konnte nicht hergestellt werden!", $this->ip, $this->port));
       }
   }
   
   // Verbindung schließen
   function disconnect()
   {
       if($this->fp)
       {
           fclose($this->fp);
       }
   }
   
   // String-Command senden
   function send_strcmd($strcmd)
   {
       fwrite($this->fp, sprintf('%c%c%c%c%s%c', 0xFF, 0xFF, 0xFF, 0xFF, $strcmd, 0x00));
   }
   
   // 1 Byte vom Server holen
   function get_byte()
   {
       return ord(fread($this->fp, 1));
   }
   
   // 1 Zeichen (1 Byte) vom Server holen
   function get_char()
   {
       return fread($this->fp, 1);
   }
   
   // einen int16-Wert (2 Bytes) vom Server holen
   function get_int16()
   {
       $unpacked = unpack('sint', fread($this->fp, 2));
       return $unpacked[int];
   }
   
   // einen int32-Wert (4 Bytes) vom Server holen
   function get_int32()
   {
       $unpacked = unpack('iint', fread($this->fp, 4));
       return $unpacked[int];
   }
   
   // einen float32-Wert (4 Bytes) vom Server holen
   function get_float32()
   {
       $unpacked = unpack('fint', fread($this->fp, 4));
       return $unpacked[int];
   }
   
   // einen String vom Server holen
   function get_string()
   {
       // so lange ein Zeichen vom Server holen, bis das Zero-Zeichen zurückgegeben wird
       while(($char = fread($this->fp, 1)) != chr(0))
       {
           $str .= $char;
       }
       
       return $str;
   }
   
   // Server-Ping ermitteln
   function ping()
   {
       $this->connect();
       
       $time1 = explode(' ', microtime());
       $this->send_strcmd("ping");
       $time2 = explode(' ', microtime());
       $this->serverinfo["ping"] = ($time2[0]-$time1[0])*1000000;
       
       $this->disconnect();
       
       return $serverinfo["ping"];
   }
   
   // Infos vom Server holen
   function infos()
   {
       $this->connect();
       $this->send_strcmd("T");
       $this->get_int32(); // -1
       $this->get_char(); // ASCII 'm' (S2A_INFO_DETAILED)
$this->serverinfo["protokoll"]        = $this->get_byte();
       
       $this->serverinfo["name"]    = $this->get_string();
       $this->serverinfo["map"]        = $this->get_string();
       $this->serverinfo["directory"]  = $this->get_string();
       $this->serverinfo["discription"]= $this->get_string();
$this->serverinfo["steam_id"] = $this->get_int16();
       $this->serverinfo["players"]    = $this->get_byte();
       $this->serverinfo["maxplayers"] = $this->get_byte();
       $this->serverinfo["bot"]    = $this->get_byte();
       $this->serverinfo["type"]  = $this->get_byte();
       $this->serverinfo["os"]        = $this->get_byte();
       $this->serverinfo["password"]   = $this->get_byte();
       $this->serverinfo["secure"]     = $this->get_byte();
       
       
       if($this->serverinfo["type"] == 'd')
       {
           $this->serverinfo["type"] = "Dedicated";
       }
       else
       {
           $this->serverinfo["type"] = "Listen";
       }
       
       if($this->serverinfo["os"] == 'w')
       {
           $this->serverinfo["os"] = "Windows";
       }
       else
       {
           $this->serverinfo["os"] = "Linux";
       }
       
       if($this->serverinfo["password"] == '1')
       {
           $this->serverinfo["password"] = "Ja";
       }
       else
       {
           $this->serverinfo["password"] = "Nein";
       }
       
       $this->disconnect();
       
       return $this->serverinfo;
   }
   
   // Player-Liste vom Server holen
   function players()
   {
       $this->connect();
       
       $this->send_strcmd("U");
       $this->get_int32(); // -1
       $this->get_char(); // ASCII 'D' (S2A_PLAYERS)
       
       $playercount = $this->get_byte();
       
       for($i=0; $i < $playercount; $i++)
       {
           $this->playerlist[$i]["index"] = $this->get_byte();
           $this->playerlist[$i]["name"]  = $this->get_string();
           $this->playerlist[$i]["frags"] = $this->get_int32();
           $this->playerlist[$i]["time"]  = date('H:i:s', round($this->get_float32(), 0)+82800);
       }
       
       $this->disconnect();
       
       return $this->playerlist;
   }
   
   // Rules-Liste (CVARs) vom Server holen
   function cvars()
   {
       $this->connect();
       
       $this->send_strcmd("V");
       $this->get_int32(); // -1
       $this->get_char(); // ASCII 'E' (S2A_RULES)
       
       $cvarcount = $this->get_int16();
       
       for($i=0; $i < $cvarcount; $i++)
       {
           $this->cvarlist[$this->get_string()] = $this->get_string();
       }
       
       $this->disconnect();
       
       return $this->cvarlist;
   }
};

?>


aufgerufen wird das ganze mit :

Code:
$cssserver = new sourceserver('css.maze-esports.de:27015');

$css_info = $cssserver->infos();
$css_player = $cssserver->players();

// ausgabe der daten.....


Sorry für den vielen Code, aber ich hab leider keine Schimmer, wie ich Fehlersuceh betreiben sollte dabei.
Kann man irgendwie abfragen/ausgeben ob der Webserver irgendwelche Connectiosn noch offen hat oderso ?


Danke

Gruß
Frank
 
Zuletzt bearbeitet:
Ich hab mir deinen Code jetzt nicht durchgelesen.
Für mich klingt das Ganze aber so, als ob dein Server einfach nicht leistungsstark genug ist.
 
Hm.. das glaub ich weniger.
Das ist eine 1Ghz Maschine /512mb Ram
Der Server hat nix zu tun ausser dem Webserver/MySQL und einem Schwung IRC Bouncer/Clients.
Wenn ich ein fertiges Script nehme (Psychostats z.B.) funktioniert das ganze ja auch ohne Probleme.
Ausserdem glaube ich, dass ein phpbb ,was da läuft unter gewissen Umstaenden sicherlich mehr Leistung abverlangt als mein popeliges Script.
Wenn ich das auskommentiere was diese Klasse betrifft geht auch alles einwandfrei. Es muss wohl an dieser Klasse liegen :/
Naja mal sehen wie ich die Klasse abspecken kann und nur das drinbehalte, was für mich wirklich wichtig ist.

Danke trotzdem :)

Gruß
Frank
 

Neue Beiträge

Zurück