【问题标题】:PHP Team Fortress 2 Server Status always returns offlinePHP Team Fortress 2 服务器状态总是返回离线
【发布时间】:2014-01-01 17:21:57
【问题描述】:

我正在尝试在我的主页上集成一个服务器状态,一个简单的图像系统(一个在服务器开启时显示,另一个在服务器关闭时显示)但是当前的 php 代码总是在服务器处于离线状态时返回在线:

<?php

$ip = "173.208.81.98"; 
$port = "27015"; 

$sock = @fsockopen( $ip, $port, $num, $error, 1 );

if( !$sock ){


echo( "<img src='../assets/images/off2.png' style='width: 100%'>");
}

else( $sock ){


echo( "<img src='../assets/images/on2.png' style='width: 100%'>" );
fclose($sock);

}

?>

这是军团要塞 2 服务器,以防万一

【问题讨论】:

  • 删除@ 以查看可能出现的任何错误消息
  • 不是解决方案,而是使用 if...else 而不是这两个 ifs
  • @Sbls 完成并更新,谢谢
  • @Pekka 웃 说无法连接到ip
  • 那是你的问题。它到底在说什么?

标签: php status steam


【解决方案1】:

我不知道它为什么有效,但它似乎适用于 stream_socket_client显然不是

$ip = "173.208.81.98";
$port = 27015;
if(@stream_socket_client("tcp://$ip:$port") !== false) {
    echo 'online';
} else {
    echo 'offline';
}

E:

https://developer.valvesoftware.com/wiki/Server_queries

您可以发送到服务器的命令列表。但是没有在线选项。我认为您仍然需要检查 stream_socket_client 是否为假。如果为假,则服务器肯定已关闭。您可能可以访问服务器,但它被列为不可用。我不知道 Valve 是如何处理这些事情的。我注意到它与 firepoweredgaming.com 上的列表不一致。

所以,基本上以下内容并不适合您。但也许你可以使用它。

    function server($ip, $port) {
        $command = "\377\377\377\377TSource Engine Query\0";
        $socket = stream_socket_client("udp://$ip:$port");
        fwrite($socket, $command);  // Send the command
        $JunkHead = fread($socket,4);

            fread($socket, 1); // Always equal to 0x49, Header chunk
            $return['protocol'] = ord(fread($socket, 1));
            $return['name'] = getNextString($socket);
            $return['map'] = getNextString($socket);
            $return['folder'] = getNextString($socket);
            $return['game'] = getNextString($socket);
            $return['id'] = ord(fread($socket, 2));
            $return['players'] = ord(fread($socket, 1));
            $return['max_players'] = ord(fread($socket, 1));
            $return['bots'] = ord(fread($socket, 1));
            $return['server_type'] = fread($socket, 1); // [d]edicated, [l] non-dedicated, [p] SourceTV
            $return['environment'] = fread($socket, 1); // [l]inux, [w]indows or [m]ac
            $return['visibility'] = ord(fread($socket, 1)); // 1==private
            $return['vac'] = ord(fread($socket, 1)); // 1==secure
            $return['version'] = getNextString($socket);

        return $return;
    }

    /**
     * freads until \0 is found. Nullterminated string.
    */
    function getNextString($socket) {
        $str = '';
        while(($read = fread($socket, 1)) != "\0") {
            $str .= $read;
        }
        return $str;
    }

我有一个名为 server 的函数,它将数据读入一个数组。 (您可以使用print_r(server('173.208.81.98', 27015)) 打印它)。我使用ord() 从ascii 中获取数字,因为php 将套接字读取为ascii。

【讨论】:

  • 这个根本不行,就算服务器离线也显示在线
  • 我无法使用 TF 服务器对其进行测试。但是,如果我切换 IP 甚至端口,它会显示我离线。您的服务器当前离线!
  • 我的服务器处于离线状态,我正在使用这些:firepoweredgaming.com/forums/page/servers_live 测试状态,上面的 ip 来自第一个,即在线
  • 对我来说结果相同。
  • 甚至那些离线的?我想我一定是在某个地方搞砸了
【解决方案2】:

1 秒的连接超时不是很长。即使主机/端口有效,网络延迟也足以触发它。我建议至少使用 2.5 - 5 秒。

试试这个:

<?php
    $ip = "173.208.81.98"; 
    $port = "27015"; 
    $sock = @fsockopen( $ip, $port, $num, $error, 5 );

    if( !$sock ){
        echo( "<img src='../assets/images/off2.png' style='width: 100%'>");
    } else {
        echo( "<img src='../assets/images/on2.png' style='width: 100%'>" );
        fclose($sock);
    }
?>

【讨论】:

  • 不走运,增加到10个还是返回离线图片
  • 173.208.81.98:27015 服务器离线!警告:fsockopen(): 无法连接到 173.208.81.98:27015
  • 它在线,我正在玩。尝试了其他ip,结果是一样的
猜你喜欢
  • 2012-03-20
  • 2021-12-18
  • 2015-04-28
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 2020-04-20
相关资源
最近更新 更多