2

我正在使用 fsockopen() 调用列表中的多个连接,以查看各种 ip/host 和端口的在线状态...

<?php
$socket = @fsockopen($row[2], $row[3], $errnum, $errstr, 1);
if ($errnum >= 1) { $status = 'offline'; } else { $status = 'online';}
fclose($socket);

如果可行,我不会抱怨,但我在列表中检索了大约 15 个 ip/端口(php for() 命令..)。我想知道是否有更好的方法来做到这一点?这种方式很慢!?!服务器大约需要 1-2 分钟才能回复所有这些信息。

更新:

<?php
$socket = @fsockopen("lounge.local", "80", $errnum, $errstr, 30);
if ($errnum >= 1) { $status = 'offline'; } else { $status = 'online'; }
?>

它将显示在一个列表中:“ReadyNAS AFP readynas.local:548 online”

我不知道我还能告诉你什么?加载结果集合只需要很长时间......

4

7 回答 7

3

根据我自己的经验:

这段代码:

$sock=fsockopen('www.site.com', 80);

与以下相比要慢:

$sock=fsockopen(gethostbyname('www.site.com'), 80);

在 PHP 5.4 中测试。如果同时进行多个连接,可以保留主机解析结果并重新使用它,以进一步减少脚本执行时间,例如:

function myfunc_getIP($host) {
   if (isset($GLOBALS['my_cache'][$host])) {
      return $GLOBALS['my_cache'][$host];
   }

   return $GLOBALS['my_cache'][$host]=gethostbyname($host);
}

$sock=fsockopen(myfunc_getIP('www.site.com'), 80);
于 2012-08-21T19:29:05.357 回答
2

如果您打算“ping”某个 URL,我建议您使用 curl,为什么?您可以使用 curl 并行发送 ping,看看这个 -> http://www.php.net/manual/en/function.curl-multi-init.php。在之前的项目中,它应该向我们的服务器提供实时数据,我们过去常常 ping 主机以查看它们是否还活着,而 Curl 是唯一对我们有帮助的选项。它是一个建议,可能不是您问题的正确解决方案。

于 2011-03-06T16:36:01.690 回答
1

你比较过fsockopen(servername)vs的结果fsockopen(ip-address)吗?如果超时参数没有改变任何东西,那么问题可能出在您的名称服务器上。如果使用 IP 地址的 fsockopen 更快,则必须修复名称服务器,或将域添加到 /etc/hosts 文件。

于 2011-03-06T16:37:55.213 回答
0

我建议这样做有点不同。将此主机放在数据库中的表中,例如:

++++++++++++++++++++++++++++++++++++
| host | port | status | timestamp |
++++++++++++++++++++++++++++++++++++

并将状态检查部分移动到您每 5 分钟或您想要的频率运行一次的 cron 脚本中。该脚本将检查主机:端口并更新每条记录的状态和时间戳,在您的页面中,您只需执行数据库查询并显示主机、其状态以及上次检查的时间(例如:1 分钟前等... ) 这样您的页面将快速加载。

于 2011-03-06T16:25:00.713 回答
0

根据php手册,有一个超时参数。尝试将其设置为较低的值。

编辑:要添加到丹尼尔的答案, nmap 可能是最好的工具。使用 cron 作业对其进行设置,以每 X 分钟扫描和更新您的记录。就像是

$ for ip in $(seq 6 8); 
do 
     port_open=$(nmap -oG - -p 80 10.1.0.$ip|grep open|wc -l); 
     echo "10.1.0.$ip:$port_open"; 
done

10.1.0.6:1
10.1.0.7:1
10.1.0.8:0
于 2011-03-06T16:29:28.500 回答
0

最后一个参数fsockopen()是超时,将其设置为较低的值以使脚本更快地完成,如下所示:

fsockopen('192.168.1.93', 80, $errNo, $errStr, 0.01)
于 2011-03-06T16:34:28.700 回答
0

我遇到了一个 fsockopen 请求很慢的问题,但是 wget 真的很活泼。就我而言,这是因为主机名同时具有 ipv4 和 ipv6 地址,但 ipv6 已关闭。因此,ipv6 超时的每个请求都需要 20 秒左右的时间。

于 2013-07-04T08:00:47.797 回答