0

我拥有多个游戏服务器以及一个显示服务器状态的网站。

问题是网站(服务器状态页面)很慢,因为每次加载页面时它都需要从远程 IP ping/获取数据。

我已经看到其他地方这样做了,例如这里他们使用动态 JSON(这里)来获取服务器状态。

上面显示的似乎立即加载,我想知道这究竟是如何实现的?

基本上,我想获取服务器状态,而不会在每次加载它时造成严重滞后(最好与上面的类似,因为它运行良好)。

4

2 回答 2

1

我一直在寻找和计时您发布的示例(我承认有偏见)。
我认为(并在测试之前考虑过):他们在服务器上运行了一些代码,每 2 秒生成一次此数据。这只是意味着每次调用 json-script 时,站点都会简单地返回已经存在的数据(如 ping)。

他们甚至可能记录所有这些数据,因此 json ping 调用只返回最后一个条目。这应该给出一个几乎即时的答案和可预测的加载时间,这就是我会做的事情。

祝你好运!

于 2012-08-21T12:03:30.630 回答
1

制作两个文件:

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将返回服务器状态。

于 2012-08-21T12:09:14.903 回答