我正在处理一个网页,该网页显示了我正在运行的游戏服务器上的在线玩家数量,并且该数量是实时更新的。
问题在于,我可以在游戏服务器上显示在线的玩家数量,但是它永远不会更新,并且总是显示页面加载时服务器上的玩家数量,尽管人们每秒都会离开并加入服务器。

这是显示数字的PHP代码(很简单,仅用于测试):

<?php
    echo "<a id='a1' href='#' class='online'>Loading...</a>";
?>


我正在做的是使用javascript用新数量的在线播放器每秒更新“ a1”,这将调用一个名为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代码。

07-27 22:20