PHP fsockopen()速度非常慢

PHP fsockopen()速度非常慢,php,performance,fsockopen,Php,Performance,Fsockopen,我正在使用fsockopen()调用列表中的许多连接,以查看各种ip/主机和端口的联机状态 <?php $socket = @fsockopen($row[2], $row[3], $errnum, $errstr, 1); if ($errnum >= 1) { $status = 'offline'; } else { $status = 'online';} fclose($socket); 它将显示在一个列表中:“ReadyNAS AFP ReadyNAS.local:

我正在使用fsockopen()调用列表中的许多连接,以查看各种ip/主机和端口的联机状态

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

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


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

我建议您做一些不同的事情。 将此主机放在数据库的表中,类似于:

++++++++++++++++++++++++++++++++++++
| host | port | status | timestamp |
++++++++++++++++++++++++++++++++++++
并将状态检查部分移动到cron脚本中,使其每5分钟运行一次或按您所需的频率运行一次。 该脚本将检查每个记录的主机:端口和更新状态以及时间戳,在您的页面中,您只需执行db查询并显示主机、其状态以及上次检查的时间(例如:1分钟前,等等) 这样,您的页面将快速加载。

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

编辑:为了补充Daniel的答案,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

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

fsockopen('192.168.1.93', 80, $errNo, $errStr, 0.01)
如果你打算“ping”一些URL,我建议你使用curl,为什么?您可以使用curl并行发送ping,看看这个->。在以前的一个项目中,它应该向我们的服务器提供实时数据,我们经常ping主机以查看它们是否处于活动状态,而Curl是帮助我们的唯一选项。
这是一个建议,可能不是解决您问题的正确方法。

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

根据我自己的经验:

此代码:

$sock=fsockopen('www.site.com', 80);
与以下各项相比,速度较慢:

$sock=fsockopen(gethostbyname('www.site.com'), 80);
在PHP5.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);

我遇到了一个问题,fsockopen请求很慢,但wget确实很快。在我的例子中,这是因为主机名同时具有ipv4和ipv6地址,但ipv6已关闭。因此,每次请求ipv6超时都需要20秒左右。

感谢您减少示例代码。但是,请考虑给出一个完整的示例脚本(扫描<代码> StPoxExcel .COM< /COD>或<代码>示例.COM< /COD>等)。问题几乎肯定不在你发布的摘录中。另外请注意,如果
$socket===false
,则不应调用fclose on。谢谢,上传此代码片段后,我已将其取出。如果有人感兴趣,请更新完整的脚本示例。我使用的是
fsockopen(“localhost”)
,速度非常慢(~1010毫秒)。使用
fsockopen(“127.0.0.1”)
速度要快得多(~11毫秒)。我不会经常登录此页面(为了查看状态),因此如果没有必要,我不想对服务器施加任何压力。。但我会仔细阅读“cron”,看看它是否真的能节省一些时间。。。谢谢你的意见!最初它被设置为1,没有做任何事情,所以我把它恢复到默认值30…嗯,这可能需要更多的调试。如果可能,请使用tcpdump/wireshark查看tcp流,以了解fsockopen在做什么。它正在尝试重新发送吗?远程主机没有响应吗?是否有防火墙在工作中使用扳手?谢谢,但是这也没能让脚本运行得更快。。。谢谢你的帮助。我会调查的-谢谢!它正在从我的mac mini XAMPP服务器上运行…:)试图实现这一点,这被证明是一个挑战。。。如果我仍然迷路,我会给你回电话:)
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);