使用fsockopen();与我的服务器的连接保持打开状态;在PHP中检查他们的状态

时间:2014-12-21 21:06:18

标签: php

我一直在编写一个快速的Web应用程序来检查我在多功能服务器上运行的所有不同专用服务器进程的状态。我正在使用fsockopen检查端口,它正在做我需要它做的事情,它返回是否在这些端口上运行服务,但它似乎是让连接保持打开状态。一个特定的例子是我的Mumble服务器。每次我运行脚本时,它都会返回我的mumble服务器在线,但它打开的fsockopen连接正在增加用户数。它可以继续运行,直到达到最大用户数,然后拒绝来自实际mumble客户端的连接以及进一步尝试使用fsockopen进行检查。为Terraria运行我的服务器时会发生同样的情况。最后,在可能至少一个小时后,我的mumble服务器上的用户数量正在重置,但我不确定是关闭连接还是服务器崩溃并重新启动。

这是我用来检查端口并在页面上显示其状态的代码:

function serverPort($port, $service) {
    $fp = @fsockopen("192.168.1.xxx", $port, $errno, $errstr, 3);
        if($fp) {
            $color = "green";
            echo "<span style='font:12px/0px monospace'><b>$service</b></span>".
            spacer($service)."<span style='font:12px/0px monospace'> | 
            <b><font color=$color>online</font></span></b>\n";
            fclose($fp);
        } else {
            $color = "red";
            echo "<span style='font:12px/0px monospace'><b>$service</b></span>".
        spacer($service)."<span style='font:12px/0px monospace'> | 
        <b><font color=$color>offline</font></span></b>\n";
        fclose($fp);
        }
    stream_set_timeout($fp, 1);
    fclose($fp);
    $fp = null;

    echo "</br>";
}

我在此代码中调用了一个函数,用于输出字符串上的动态间距(spacer();),该函数在此处详述的函数之前的实际脚本中定义。这与问题没有关系,但我把它留在那里以减少我自己的困惑。

正如你可以看到的那样,我已经尝试了三种不同的方法,我遇到过的印象是为了关闭连接,但没有一种能达到预期的效果。我是相对较新的PHP,因为我可能没有触及它,因为可能是'04,HTML相同,所以任何事情都有帮助。

另外,作为参考,我已经socket_createsocket_close分别与fsockopen一起尝试了,它甚至不会回应我的预期结果。

编辑:如果有人好奇,这就是它的样子:http://i.imgur.com/C9O3SMq.png

它完全正常运行,这只是我需要解决的连接问题。

1 个答案:

答案 0 :(得分:4)

在php.net(http://php.net/manual/en/function.fclose.php

上找到
  

确保清除传入缓冲区中的任何传入数据包非常重要   使用fread()或一些等价物。虽然你可以调用fclose(),但socket不能   实际上关闭,直到入站数据包被清除。这可能导致一些   混乱。

  

如果您无法正确断开打开的某些客户端流   stream_socket_server / stream_select你应该尝试一下stream_socket_shutdown。

     

&lt;?php stream_socket_shutdown($ clientStream,STREAM_SHUT_RDWR); ?&GT;