使用 fsockopen() 与我的服务器保持打开的连接;以检查其状态


Connections to my servers remaining open using fsockopen(); in PHP to check their status

我一直在编写一个快速的Web应用程序来检查我在多用途服务器上运行的所有不同专用服务器进程的状态。我正在使用fsockopen来检查端口,它正在做我需要它做的事情,因为它返回这些端口上是否正在运行服务,但它似乎保持连接打开状态。一个特定的实例是我的Mumble服务器。每次我运行脚本时,它都会返回我的 mumble 服务器在线,但它用 fsockopen 打开的连接会增加用户计数。它可以继续运行,直到达到最大用户数,然后拒绝来自实际喃喃自语客户端的连接以及进一步尝试使用 fsockopen 进行检查。为泰拉瑞亚运行我的服务器时也会发生同样的情况。最终,大约一个小时后,我的 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_closefsockopen分开,它甚至不会与我的预期结果相呼应。

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

它是完全功能性的,只是我需要解决的连接保持打开的问题。

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

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

如果您在正确断开某些客户端流打开时遇到一些麻烦 stream_socket_server/stream_select你应该尝试stream_socket_shutdown。

<?php>