我拥有多个游戏服务器以及一个显示服务器状态的网站。
问题是网站(服务器状态页面)很慢,因为每次加载页面时它都需要从远程 IP ping/获取数据。
我已经看到其他地方这样做了,例如这里他们使用动态 JSON(这里)来获取服务器状态。
上面显示的似乎立即加载,我想知道这究竟是如何实现的?
基本上,我想获取服务器状态,而不会在每次加载它时造成严重滞后(最好与上面的类似,因为它运行良好)。
我一直在寻找和计时您发布的示例(我承认有偏见)。
我认为(并在测试之前考虑过):他们在服务器上运行了一些代码,每 2 秒生成一次此数据。这只是意味着每次调用 json-script 时,站点都会简单地返回已经存在的数据(如 ping)。
他们甚至可能记录所有这些数据,因此 json ping 调用只返回最后一个条目。这应该给出一个几乎即时的答案和可预测的加载时间,这就是我会做的事情。
祝你好运!
制作两个文件:
1:用于 ping 输出数据的 PHP 脚本“ping.php”,如下所示:
$ip = $_REQUEST['ip'];
$cache_file = "ping_{$ip}.json";
if(@filemtime($cache_file) >= (time() - 30)) {
echo file_get_contents($cache_file);
return ;
}
// cache is too old. now ping your server
$json = json_encode(Array(
'ip' => $ip,
'players' => $players_count
));
// save new cache
file_put_contents($cache_file, $json);
// output JSON
echo $result;
2:HTML + jQuery
<table id="servers">
<tr>
<td class="ip">1.2.3.4:1234</td>
<td class="players"></td>
</tr>
<tr>
<td class="ip">1.2.3.4:1234</td>
<td class="players"></td>
</tr>
<tr>
<td class="ip">1.2.3.4:1234</td>
<td class="players"></td>
</tr>
</table>
<script type="text/javascript">
$('#servers tr').each(function(){
var ip = $(this).find('td.ip').text();
var $players = $(this).find('td.players');
$players.html('loading');
// use ping.php to get count of players etc
$.get('ping.php?ip='+ip, function(data){
$players.html(data.players);
}});
</script>
只需对每个服务器使用 AJAX 请求。ping.php
将返回服务器状态。