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

时间:2016-04-21 03:48:47

标签: php port fsockopen

我正在创建自己的服务状态脚本,因为它既有机会更熟悉PHP语言,也可以从头开始设计,以满足我的需求。

我的cron作业和测试连接部件中使用的代码的一部分查询服务的IP /端口以确保它在线。我的问题是脚本只是询问端口是否是#34; Unblocked"在那个IP上,所以如果我使用FTP服务器查询端口21并且FTP服务器崩溃我的脚本将不会检测到任何更改意味着它没有做我想要它做的事情。相反,我希望查询IP和端口,并让我的脚本看看是否有实际上在该端口上运行的东西,如果有在线显示,如果没有错误输出。我已经看过google了,似乎我必须发送一个数据包/收到回复,以便PHP可以告诉那里有什么活跃的东西?我不确定。

这是我目前的代码:

<?php
    $host = $_POST['servip'];
    $port = $_POST['servport'];

    if (!$socket = @fsockopen($host, $port, $errno, $errstr, 3)) {
        echo "Offline!";
    } else {
        echo "Online!";
        fclose($socket);
    }
?>

2 个答案:

答案 0 :(得分:1)

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

  

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

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

// 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;
}

答案 1 :(得分:0)

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

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

要完全确定,最好在PHP中使用ftp://处理,例如实际上是对用户进行身份验证(也许用户身份验证已被破坏,但它仍然能够发送问候语 - 这个数量是否已“关闭”?)

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