Serverstatus

Headymaster

Erfahrenes Mitglied
So habe mal was versucht in PHP um erstma überhaupt ne Ausgabe über nen Gameserver zu bekommen.

Habe das ganze mal über paar Tutorials und so eben zusammengebastelt.....hmmm....aber das Prob ist, dass ich glaube, das ich net dauerschleife drinne habe oder so, denn er läd und läd und läd und dann kommt:

Fatal error: Maximum execution time of 60 seconds exceeded in.... on line 44


Hier mal der Code zu schauen :)

PHP:
<?php
    class serverquery
	{
	     private $servercon;   // Enthält eine Verbiundung zu einem GameServer
		 private $ip;
		 private $port;
		 
		 // Variablen zur Ausgabe der Infos
		 private $serverinfo;
         private $playerlist;
         private $cvarlist;
	
	     function __cunstruct($ip, $port)
		 {
		    $this->ip = $ip;
			$this->port = $port;
		 }
		 
		 //#############################################################################//
		 // 1. Baut eine Verbindung mit einem Gameserver auf                            //
		 //#############################################################################//
		 function congs()
		 {
		     if(!$this->servercon = fsockopen("udp://".$this->ip, $this->port, $errno, $errstr, 3))
			 {
			   @socket_set_timeout($this->servercon, 3);
			   die(sprintf("Verbindung zu %s:%s konnte nicht hergestellt werden!", $this->ip, $this->port));
			 }
		 }
	
	     //#############################################################################//
		 // 1. Sendet einen String-Command                                              //
		 // 2. 1 Byte vom Server holen                                                  //
		 // 3. 1 Zeichen (1 Byte) vom Server holen                                      //
		 // 4. Einen INT16-Wert (2 Byte) vom Server holen                               //
		 // 5. Einen INT32-Wert (4 Byte) vom Server holen                               //
		 // 6. Einen Float32-Wert (4 Byte) vom Server holen                             //
		 // 7. Einen String vom Server holen bis Zero-Zeichen                           //
		 //#############################################################################//
		 function send_strcmd($strcmd)
		 {
		     fwrite($this->servercon, sprintf('%c%c%c%c%s%c', 0xFF, 0xFF, 0xFF, 0xFF, $strcmd, 0x00));
		 }
		 
		 function get_byte()
		 {
		     return ord(fread($this->servercon, 1));
		 }
		 
		 function get_char()
		 {
		     return fread($this->servercon, 1);
		 }
		 
		 function get_int16()
         {
             $unpacked = unpack('sint', fread($this->servercon, 2));
             return $unpacked[int];
         }
		 
		 function get_int32()
		 {
		     $unpacked = unpack('iint', fread($this->servercon, 4));
             return $unpacked[int];
		 }
		 
		 function get_float32()
		 {
		     $unpacked = unpack('fint', fread($this->servercon, 4));
             return $unpacked[int];
		 }
		 
		 function get_string()
		 {
		     while (($char = fread($this->servercon, 1)) != chr(0))
			 {
			    $str .= $char;
			 }
			 return $str;
		 }
		 
		 //#############################################################################//
		 // Ping einen Gameserver an                                                    //
		 // 1. Liest die Serverinfos des HL-Server aus                                  //
		 // 2. Liest die Playerdetails des HL-Servers aus                               //
		 //#############################################################################//
         function ping()
         {
		     $this->congs();
        
             $time1 = explode(' ', microtime());
             $this->send_strcmd("ping");
             $time2 = explode(' ', microtime());
             $this->serverinfo["ping"] = ($time2[0]-$time1[0])*1000000;
        
             $this->disc();
        
             return $serverinfo["ping"];
         }
		 
		 function infos()
         {
		    $this->congs();
		 
            $this->send_strcmd("details");
            $this->get_int32(); // -1
            $this->get_char(); // ASCII 'm' (S2A_INFO_DETAILED)
        
            $this->serverinfo["address"]    = $this->get_string();
            $this->serverinfo["name"]       = $this->get_string();
            $this->serverinfo["map"]        = $this->get_string();
            $this->serverinfo["gamedir"]    = $this->get_string();
            $this->serverinfo["game"]       = $this->get_string();
            $this->serverinfo["players"]    = $this->get_byte();
            $this->serverinfo["maxplayers"] = $this->get_byte();
            $this->serverinfo["protocol"]   = $this->get_byte();
            $this->serverinfo["type"]       = $this->get_char();
            $this->serverinfo["os"]         = $this->get_char();
            $this->serverinfo["password"]   = $this->get_byte();
            $this->serverinfo["mod"]        = $this->get_byte();
        
            if($this->serverinfo["mod"] == 1)
            {
                $this->serverinfo["mod_info"]    = $this->get_string();
                $this->serverinfo["mod_dl"]      = $this->get_string();
                $this->serverinfo["mod_version"] = $this->get_int32()/256;
            }
        
             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->send_strcmd("infostring");
            $this->get_int32(); // -1
            fread($this->congs, 20);
        
            $infostring = explode("\\", $this->get_string());
            $this->serverinfo["proxytarget"] = $infostring[7];
        
            if($this->serverinfo["proxytarget"] == '1')
            {
                $this->serverinfo["proxytarget"] = "Ja";
            }
            else
            {
                $this->serverinfo["proxytarget"] = "Nein";
            }
        
            $this->disc();
        
            return $this->serverinfo;
	     }
		 
		 function get_plinfo_hl()
		 {
		     $this->congs();
        
                     $this->send_strcmd("players");
                     $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->disc();
        
           return $this->playerlist;
		 }
		 
		 function cvars()
         {
		    $this->congs();
        
             $this->send_strcmd("rules");
             $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->disc();
        
           return $this->cvarlist;
    }
		 
		 //#############################################################################//
		 // 1. Baut die Verbindung mit einem Gameserver ab                              //
		 //#############################################################################//
		 function disc()
		 {
		     if($this->servercon)
			 {
			   fclose($this->servercon);
			 }
		 }
	}

$hlserver = new serverquery('85.14.224.114', '27015');
echo $hlserver->ping();
echo $hlserver->infos();
echo $hlserver->get_plinfo_hl();
$hlserver->disc();

Würde mich über Hilfe freuen :)

MFG Niels
 
Ja genau wird unter der Klasse angezeigt....also rufe halt in der gleichen Datei wo die Klasse ist die Klasse auf, damit ich diese erstma testen kann bevor ich sie in weitere Scripte einbinde :)

Nur leider geht das ganze ja net ... :(

MFG Niels


//EDIT

Noch zur Info.... Mein Xampp Webserver ranzt auch jedesmal ab wenn ich das Script ausführe.....
 
Zuletzt bearbeitet:
Hättet ihr denn ne Idee.....?!

Habe mir nun noch andere Tutorials angeschaut aber vom Connecten bis zum Abfragen der einzelnden Infos des Servers wird dort alles gleich gemacht.....

Ich steig da echt net mehr durch.....denn wenn ich nur connecte zum Server ist ja alles ok, das geht noch ich bekomme kein Fehler dass der Server nicht erreichbar sei, aber sobald ich Infos vom Server haben will passiert gar nichts mehr außer dass sich der Browser tot läd und mein Webserver ( localhost ) abschmiert....

MFG Niels
 
Zurück