Bekijk Volledige Versie : Server status script
Hallo,
Via deze weg zoek ik hulp om een php script wat ik heb af te maken. Aangezien mijn kennis te beperkt is op dit moment. Ik hoop dat ik in de goede groep post.
Hier is het probleem: ik heb momenteel een werkend script die kan zien of de game draait of niet. Echter als de gameserver uit gezet wordt krijg ik na 30 seconden een foutmelding: maximum of 30 seconds exeeded......
Ik zoek iemand die dit voor mij aan wil passen zodat die foutmelding niet meer voorkomt en hij gewoon een echo geeft.
Ik ben hier al weken mee bezig en ik hoop hier de oplossing te kunnen vinden.
Groeten, Jack
Om warnings uit te schakelen voeg het volgende bovenaan je file toe:
error_reporting(0);
Dit lijkt te helpen want ik kreeg geen melding meer. Ik houd dit voorlopig even aan totdat ik een manier vind om dit euvel te ontwijken zodat ik een echo message kan laten weer geven.
Bedankt to zover.
Dit lijkt te helpen want ik kreeg geen melding meer. Ik houd dit voorlopig even aan totdat ik een manier vind om dit euvel te ontwijken zodat ik een echo message kan laten weer geven.
Bedankt to zover.
Sowieso eens kijken of je die time-out kunt verlagen, daarnaast is het NIET verstandig om error_reporting(0) te gebruiken voor je hele applicatie. Je kunt dan beter de error voor 1 functie onderdrukken door er @ voor te zetten.
Bijv: @fopen();
ik weet niet hoe ik de time out moet verlagen. Maar ik ga morgen even proberen die @ ervoor te zetten.
dus in plaats van:
// CONN WRITE READ [1]
$s_con = fsockopen("udp://".$s_ip, $s_port,$errno, $errstr, $timeout);
dit
// CONN WRITE READ [1]
$s_con = @fsockopen("udp://".$s_ip, $s_port,$errno, $errstr, $timeout);
bedoel je ?
http://nl2.php.net/manual/en/function.socket-set-timeout.php
Je kan als basis voor je PHP query ook het volgende gebruiken:
http://jr.terragate.net/gsQuery/docs/
gsQuery is een tool om gameservers mee te querien, je moet het zelf integreren in je eigen site. In deze tool zit het error gedeelte al verwerkt, dus ook je timeout probleem.
Met ^^
We gebruiken zelf ook een OpenSourcescript, die is aangepast dat ook de klanten laat zien / Afgekochte slots / Servernaam zelf, om zo in 1 single-muisklik te controleren of men zich nog wel aan de regels houdt.
Er zijn namelijk klanten die het aantal slots verhogen, Naamgebruik niet afkopen enz. Dat in een script te hebben is enorm handig. Het is net als een CV dat je 1malig aanmaakt, en in het vervolg alleen nog maar bijwerkt.
$timeout = 2;
$s_con = @fsockopen("udp://".$s_ip, $s_port,$errno, $errstr, $timeout);
??
Dat laaste haalt niet veel uit. Hij blijft 30 seconden lang kijken of hij er is. Is er niet een manier om die tijd te verkorten ? (vind ik wel erg lang overigens)
Laten we zeggen dat hij maar tussen de 5 en 10 seconden mag scannen en dan de melding weergeeft.
Zag dat 'ErikKosters' zoiets gebouwd heeft en voor een bedragje aanbiedt op http://www.webhostingtalk.nl (http://www.webhostingtalk.nl/te-koop-gevraagd-te-koop-aangeboden/106553-tk-network-operations-center-update.html)
Is het niet een idee om van iets werkends uit te gaan en daarop eventueel verder te bouwen? Wellicht kunne jullie samen iets uitwerken.
George/
Het script werkt opzich perfect, maar ik zoek nog een oplossing voor de scan tijd als de server fysiek offline is. Dan duurt het 30 seconden voordat hij dat weergeeft. Aangezien er meerdere servers op deze manier worden weergegeven duurt het veel te lang voordat de pagina geheel wordt geladen.
Hoe verkort ik in het script de scan tijd naar pakweg 2 a 5 seconden ?
<?php
set_time_limit(0);
$s_port = 12203; // Serverport
$s_ip = "82.217.212.106"; // Server-IP
$timeout = 2;
// CONN WRITE READ [1]
$s_con = fsockopen("udp://".$s_ip, $s_port,$errno, $errstr, $timeout);
// $s_con == false if fsockopen failed
if(!$s_con)
die(msg_server('Unable to connect with fsockopen [1];; '.$errstr));
// fwrite return false on write error, else it return how many bytes written
if(fwrite($s_con, "ÿÿÿÿ". chr (0x02). "getstatus". chr (0x00))===FALSE)
die(msg_server('Unable to write to $_con [1]'));
// fread return false on read error, else it return the read string
if(($ffb = fread($s_con,4))===FALSE)
die(msg_server('Unable to read from $_con after write. [1]'));
// stream_get_meta_data is same as socket_get_status
$meta_data = stream_get_meta_data($s_con);
if($meta_data["unread_bytes"]==0)
die(msg_server('server DOWN'));
$beginnen = fread($s_con, $meta_data['unread_bytes']);
fclose($s_con);
$data = explode("\n", $beginnen);
// Serverinfo
// CONN WRITE READ [2]
$s_con = fsockopen("udp://".$s_ip, $s_port,$errno, $errstr, $timeout);
if(!$s_con)
die(msg_server('Unable to connect with fsockopen [2];; '.$errstr));
if(fwrite($s_con, "ÿÿÿÿ". chr (0x02). "getstatus". chr (0x00))===FALSE)
die(msg_server('Unable to write to $_con [2]'));
// bytes lezen en verbindingsopbouw
if(($ffb = fread($s_con,4))===FALSE)
die(msg_server('Unable to read from $_con after write. [2]'));
$meta_data = stream_get_meta_data($s_con);
if($meta_data["unread_bytes"] == 0)
die(msg_server('No data, sorry. ('.$ffb.')'));
$beginnen = fread($s_con, $meta_data['unread_bytes']);
fclose($s_con);
msg_server('server ACTIEF');
function msg_server($server_status,$errmsg=''){
echo "
<div class='scanner' id='hoofd'>
<div class='picture'><img src='sc-moh.gif' alt='1' /></div>
<div class='status'>$server_status</div>
</div>";
}
?>
wij doen dit zo:
- wij scannen eerst of alle servers/machines nog draaien, resultaat wordt in DB gedumpt
- Als een server/machine draait scannen we alle games die erop staan, ook deze gegevens worden in db gedumpt
- via cronjobs worden de servers/machines elke 15 minuten gescant of ze nog werken (we scannen ook of de ftp en restart scripts werken) en de games worden elke minuut gequeried
Als een machine(server) offline gaat krijgen we een melding en worden automatisch ook alle queries naar die machine gestopt (heeft geen nut dan). De klant kan in zijn controle panel zien dat bv zijn game offline is maar ook dat de gehele server offline is. Wat we extra gedaan hebben is als bv de server/machine offline is direct de:
- start en stop knop/functie
- edit game config file knop/functie
- filemanager/webftp knop/functie
uit geschakeld zodat de klanten dit ook niet kunnen proberen, de machine is immers offline. Ook autorestart scripts die ervoor zorgen dat gecraste games automatisch worden herstart werken niet meer meer als een machine offline is. ook controle scipts (aantal max spelers, public/private, servernaam etc ) worden direct uitgezet als een machine offline is.
Als je trouwens dat query script gebruikt, wat geheel gratis is, dan heb je ook het probleem niet met offline servers hierin zit al een error check ingebouwd.
Succes!
Ik had het script al eerder geprobeerd en toen kreeg ik een bult fouten voor mijn oortjes... Maar ik heb het op uw aanraden nogmaals geprobeerd, en met de botte bijl even het script wat kleiner gemaakt. Gewoonweg de routines die fout veroorzaakte eruit gesmeten :)
Ziedaar ik had resultaat met de regel http://mijn site /src/examples/example_usage.php?host=82.217.212.106&queryport=28960&protocol=gamespy
Ook met een mohaa poort geprobeerd en dat werkte ook. Ik denk dat ik hiermee maar verder ga proberen en mijn oude script laat varen.
Helaas is mijn kennis van php nog erg gelimiteerd dus dat wordt weer wat avondjes zweten.
Misschien dat ik wat dit betreft hier wellicht een beetje support kan krijgen ?
In ieder geval bedankt voor de hulp tot nu toe !
Je kan ook gewoon de time-out waarde aanpassen met de functie ini_set() (http://nl2.php.net/ini_set).
hmmz, als ik een getal invul tussen de () dan komt de foutmelding onverwachte variabele.
Het is voor mij allemaal nog abracadabra.
Als je op de link had geklikt had je ook gezien dat je niet alleen een waarde moet invullen. Ini_set is een functie waarmee je instellingen uit php.ini kunt wijzigen, dus ook de time-out tijd. Hoe dit precies werkte zie je op de gelinkte pagina.