Php - Mehrere Ports prüfen

04/14/2014 18:57 Cℓoud#1
Serv .. ich möchte gerne den Status meines Gameserver abfragen, dieser läuft über mehrere Dienste mit verschiedenen Ports. Wenn nun einer dieser Dienste ausfällt soll mir ein "Offline" ausgegeben werden, laufen alle Dienste soll mir natürlich ein "Online" ausgegeben werden. Ich weiß das man einzelne Ports mit fsockopen() prüfen kann. Nun hab ich mir folgendes Script gebastelt:

Code:
<?php
	$Server  = "127.0.0.1";
	$AccountLog = "9005";
	$LoginServer = "9010";
	$Character = "9100";
	$GameLog = "9101";

	if ($Server and $AccountLog and $LoginServer and $Character and $GameLog) {
		$serverstatus =  @fsockopen("$Server", $AccountLog, $LoginServer, $Character, $GameLog);
	}
		if($serverstatus) {
			echo "<font color='#11c908'>Online</font>";
		}
		else {
			echo "<font color='#ff0000'>Offline</font>";
		}
?>
Leider funktioniert es nicht und setzt den Status Online/Offline nach $AccountLog. Kann mir da jemand helfen?
04/14/2014 19:01 3lue#2
Du kannst die Ports nicht reihenweise als Argumente aufführen, sondern musst jeden einzeln per fsockopen überprüfen. ;)
04/15/2014 14:12 5anku#3
Hab vor einer weile mal eine Klasse dafür geschrieben. Ich habe sie für dich schnell angepasst (aber nicht getestet).
Ausserdem schreibe ich den Status jede Minute in ein File. Wenn man nämlich das Script bei jedem aufruf ausführt, flooded man sozusagen seine eigenen Services.

Soll heissen ich lade deine Seite immer wieder neu, und jedes mal wird ein Socket geöffnet. Beim WorldManager endet es damit, das er jedes mal einen neuen Spieler hinzufügt.

PHP Code:
<?
class fiesta_status_class {

    var 
$pathToFile "file/status/server.txt";
    var 
$serverAddress "127.0.0.1";
    var 
$serverPort = array("9005""9010""9100""9101");
    
    
    public function 
checkStatus() {
                
$status true;
        for (
$i 0$i count($this -> serverPort); $i++) {
            
$status &= $this -> getStatus($this -> serverPort[$i], $this -> serverAddress);
        }
        return 
returnOnlineStatus($status);
    }
    
    private function 
getStatus($port$ip) {
        if ( (
time() - filemtime($pathToFile)) / 60  1) {
            
$status $this -> getServiceStatus($ip$port);
            
$fileWriter fopen($pathToFile"w+");
            
fwrite($fileWriter$status);
            
fclose ($fileWriter);
        } else {
            
$fileWriter fopen($pathToFile"r");
            while(!
feof($fileWriter)) {
                
$status fgets($fileWriter);
            }
            
fclose ($fileWriter);
        }
        return 
$status;
    }
    
    private function 
getServiceStatus($ip$port) {
        
$socketAccept = @fsockopen($ip$port$errno$errstr2);
        if (
$socketAccept) {
            return 
true;
        } else { 
            return 
false;
        }
    }
    
    private function 
returnOnlineStatus($status) {
        
//$infoArray = array('<font color='#ff0000'>Offline</font>', '<font color='#11c908'>Online</font>');
        
$infoArray = array('OFFLINE''ONLINE');
        if (!
$status) {
            return 
$infoArray[0];
        } else { 
            return 
$infoArray[1];
        }
    }
}
?>