PHP检查端口是否处于活动状态


PHP Checking if a port is Active

我正在创建自己的服务状态脚本,这既是一个熟悉PHP语言的机会,也是一个从头开始尽可能高效地设计它以满足我的需求的机会。

在我的cron作业和测试连接部分中使用的代码的一部分会查询服务的IP/端口,以确保它处于联机状态。我的问题是,脚本只是查询该IP上的端口是否"未锁定",因此,例如,如果我用FTP服务器查询端口21,而FTP服务器崩溃,我的脚本将不会检测到任何更改,这意味着它没有做我希望它做的事。相反,我希望查询IP和端口,并让我的脚本查看该端口上是否真的有东西在运行,如果有在线显示,如果没有出错。我在谷歌上看了一下,似乎我必须发送一个数据包/接收一个响应,这样PHP才能知道有什么活动?我不确定。

下面是我当前的代码:

<?php
    $host = $_POST['servip'];
    $port = $_POST['servport'];
    if (!$socket = @fsockopen($host, $port, $errno, $errstr, 3)) {
        echo "Offline!";
    } else {
        echo "Online!";
        fclose($socket);
    }
?>

http://php.net/manual/en/function.fsockopen.php

fsockopen—打开Internet或Unix域套接字连接套接字将在默认情况下以阻止模式打开。您可以将其切换到使用stream_set_blocking()的非阻塞模式。函数stream_socket_client()类似,但提供了一组更丰富的选项,包括非阻塞连接和提供流上下文。

由于fsockopen将连接或不连接(超时),因此它告诉连接是否可用("打开")或被阻止(防火墙等)。

// Ping by website domain name, IP address or Hostname
function example_pingDomain($domain){
    $starttime = microtime(true);
    $file      = @fsockopen($domain, 80, $errno, $errstr, 10);
    $stoptime  = microtime(true);
    $status    = 0;
    if (!$file) { 
        $status = -1;  // Site is down
    } else {
        fclose($file);
        $status = ($stoptime - $starttime) * 1000;
        $status = floor($status);
    }
    return $status;
}

如果你真的想知道FTP服务器是否工作,你最好的选择是实际向它发送FTP命令。

FTP服务器在连接时通常应使用前三个字节"220"或"120"进行回复。220是一个"问候语"。您可以在RFC 959中阅读更多内容。

可以完全肯定的是,您可能最好在PHP中使用ftp://处理,例如实际验证用户(可能用户身份验证被破坏,但它仍然可以发送问候语-计数是"向下"吗?)

无论如何,如果你想要比"我能在那个端口上连接吗?"或"连接是否及时成功?"更好的东西,你必须深入研究通过套接字进行的实际通信。最终,这意味着您必须为每种类型的服务做一些特殊的事情(对于某些服务,读取字节,对于其他服务,写入字节等)