Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP检查端口是否处于活动状态_Php_Port_Fsockopen - Fatal编程技术网

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

PHP检查端口是否处于活动状态,php,port,fsockopen,Php,Port,Fsockopen,我正在创建自己的服务状态脚本,这既是一个更加熟悉PHP语言的机会,也是一个根据我的需要尽可能高效地从头开始设计它的机会 在cron作业和测试连接部件中使用的代码部分会查询服务的IP/端口,以确保其处于联机状态。我的问题是,该脚本只是查询该IP上的端口是否“未被阻止”,因此,例如,如果我使用FTP服务器查询端口21,并且FTP服务器崩溃,则我的脚本不会检测到任何更改,这意味着它没有执行我希望它执行的操作。相反,我希望查询IP和端口,并让我的脚本查看该端口上是否确实有运行的内容,是否有show on

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

在cron作业和测试连接部件中使用的代码部分会查询服务的IP/端口,以确保其处于联机状态。我的问题是,该脚本只是查询该IP上的端口是否“未被阻止”,因此,例如,如果我使用FTP服务器查询端口21,并且FTP服务器崩溃,则我的脚本不会检测到任何更改,这意味着它没有执行我希望它执行的操作。相反,我希望查询IP和端口,并让我的脚本查看该端口上是否确实有运行的内容,是否有show online if not error out。我看了一下google,似乎我必须发送一个数据包/接收一个响应,这样PHP才能知道有什么活动?我不确定

以下是我当前的代码:

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

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

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

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


如果您真的想知道FTP服务器是否正常工作,最好的选择是向它发送FTP命令

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

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


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

我已经尝试过了,我得到了它所做工作的一般jist,但是在FTP服务器处于活动状态并禁用的情况下进行了一些测试之后,$status的输出仍然可以从0到8不等,这意味着我仍然无法可靠地检测FTP服务器何时被禁用/崩溃。测试一个我知道在服务器上被阻止的端口将始终显示-1,尽管这很好。你知道为什么吗?我想你可以用ftp_connect()做额外的连接测试。我在90%的时间里都是无意中按回车键的。这是一个关于所谓的文本编辑器的令人恼火的事情。无论如何,我想你也会遇到同样的问题。您只能尝试从客户端连接到服务器,如果服务器不提供连接信息,则无法从服务器获取连接信息。换句话说,如果服务器是发送还是接收,那么你将100%确定。是的,这很公平,这就是我担心的。我只有一手想要测试的端口,但我真的想证明自己,以防我使用其他端口。
// 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;
}