我正在制作一个网页,显示我正在运行的游戏服务器上的在线玩家数量,这是实时更新的。问题是我可以在游戏服务器中显示在线玩家的数量,但它永远不会更新,并且总是显示页面加载时服务器上的玩家数量,尽管人们离开并每秒加入服务器。
这是显示数字的PHP代码(它很简单,只是为了测试):
<?php
echo "<a id='a1' href='#' class='online'>Loading...</a>";
?>
我正在做的是更新'a1'每秒使用javascript的在线玩家的新数量,它调用一个名为getplayers()的php函数:
<script language="JavaScript">
setInterval(function(){
document.getElementById("a1").innerHTML = '<?php echo getplayers()?>';
}, 1000);
</script>
函数getplayers()就是这样的
<?php
include "Status.php";
function getplayers() {
$serverb = new Status("mc.spainpvp.com", '25565');
return $serverb->online_players;
}
?>
最后,Status.php是一个获取在线玩家数量和更多关于服务器的东西的脚本,我确信这是有效的:
<html>
<?php
class Status {
public $server;
public $online, $motd, $online_players, $max_players;
public $error = "OK";
function __construct($url, $port = '25565') {
$this->server = array(
"url" => $url,
"port" => $port
);
if ( $sock = @stream_socket_client('tcp://'.$url.':'.$port, $errno, $errstr, 1) ) {
$this->online = true;
fwrite($sock, "xfe");
$h = fread($sock, 2048);
$h = str_replace("x00", '', $h);
$h = substr($h, 2);
$data = explode("xa7", $h);
unset($h);
fclose($sock);
if (sizeof($data) == 3) {
$this->motd = $data[0];
$this->online_players = (int) $data[1];
$this->max_players = (int) $data[2];
}
else {
$this->error = "Cannot retrieve server info.";
}
}
else {
$this->online = false;
$this->error = "Cannot connect to server.";
}
}
}
?>
</html>
所以我的问题是,如果有人知道为什么它总是更新第一个玩家数量,而不是把新的玩家数量?
不能通过Javascript调用PHP函数。PHP在请求时在服务器上进行处理。在响应中没有任何PHP代码是可见的,因为它已经被处理过了。
那么你的javascript代码看起来就像:
<script language="JavaScript">
setInterval(function(){
document.getElementById("a1").innerHTML = 'XXXXX';
}, 1000);
</script>
,其中XXXXX
为请求时间内的玩家数量。因此,您的代码将每秒钟用静态内容替换元素innerHTML。
如果你想每秒获得新的玩家数量,你需要使用Ajax。你可以使用XMLHttpRequest
创建自己的请求,或者你可以使用一些库,如jQuery和它的$.ajax
方法。您还需要服务器上的PHP代码来提供这些信息。