前段時間我用查詢來檢查一個minecraft服務器的狀態。 PHP,但我對結果並不滿意。有時它只需要10秒以上,或者即使MC服務器啓動並且網絡服務器位於同一數據中心內,也沒有獲得狀態。獲取Minecraft服務器狀態的最佳方式 - 查詢,stream_socket ...?
您認爲哪種方法最穩定並具有良好性能:query,stream_stocket還是其他?
我應該每30秒通過一次運行測試。一個cronjob或只是緩存結果30秒'?
前段時間我用查詢來檢查一個minecraft服務器的狀態。 PHP,但我對結果並不滿意。有時它只需要10秒以上,或者即使MC服務器啓動並且網絡服務器位於同一數據中心內,也沒有獲得狀態。獲取Minecraft服務器狀態的最佳方式 - 查詢,stream_socket ...?
您認爲哪種方法最穩定並具有良好性能:query,stream_stocket還是其他?
我應該每30秒通過一次運行測試。一個cronjob或只是緩存結果30秒'?
您可以使用此代碼創建一個PHP文件並定期運行以存儲狀態。
<?php
/**
* @author Kristaps Karlsons <[email protected]>
* Licensed under MPL 1.1
*/
function mc_status($host,$port='25565') {
$timeInit = microtime();
// TODO: implement a way to store data (memcached or MySQL?) - please don't overload target server
$fp = fsockopen($host,$port,$errno,$errstr,$timeout=10);
if(!$fp) die($errstr.$errno);
else {
fputs($fp, "\xFE"); // xFE - get information about server
$response = '';
while(!feof($fp)) $response .= fgets($fp);
fclose($fp);
$timeEnd = microtime();
$response = str_replace("\x00", "", $response); // remove NULL
//$response = explode("\xFF", $response); // xFF - data start (old version, prior to 1.0?)
$response = explode("\xFF\x16", $response); // data start
$response = $response[1]; // chop off all before xFF (could be done with regex actually)
//echo(dechex(ord($response[0])));
$response = explode("\xA7", $response); // xA7 - delimiter
$timeDiff = $timeEnd-$timeInit;
$response[] = $timeDiff < 0 ? 0 : $timeDiff;
}
return $response;
}
$data = mc_status('mc.exs.lv','25592'); // even better - don't use hostname but provide IP instead (DNS lookup is a waste)
print_r($data); // [0] - motd, [1] - online, [2] - slots, [3] - time of request (in microseconds - use this to present latency information)
學分:skakri(https://gist.github.com/skakri/2134554)
謝謝,但問題是關於哪種方式最快(資源使用率最低)而不是如何。 ;) – user2693017
@ user2693017這個腳本非常快。這裏花了1秒鐘。 – user1979379
個人來說,我使用'socket_sendto()'和'socket_readfrom()',因爲你並不需要連接到插座發送/接收請求。您可以嘗試使用memcached將結果存儲x秒,然後當數據到期時再次存儲它。 –
@ BenFortune嗨,我從來沒有工作mit socket_sendto()和socket_readfrom()你會如此善良,並告訴我你是如何做到的?你認爲它的工作方式比查詢或stream_stocket_client更穩定,性能更好嗎? – user2693017