-1

我有这个用于检测访问者端口的小功能。问题是它太慢了。它将页面加载时间增加了大约 3 秒;这自然是不能接受的。

有人可以对此进行改进以获得更好的页面加载时间吗?

function ipProxyPortCheck($ip){
    $timeout = 1;
    $ports = array(80,3128,8080);
    $flag = 0;
    foreach($ports as $port){
        @$fp = fsockopen($ip,$port,$errno,$errstr,$timeout);
        if(!empty($fp)){
            $flag = 1;
            fclose($fp);
        }
    }
    return $flag;
}
4

3 回答 3

2

除非通过减少超时值,否则在一般情况下无法改进此代码。如果您的访问者在您尝试连接到他们时根本没有响应,则需要经过完整的超时间隔才能确定他们无法连接。

除此之外,您可以进行的改进是break;在您成功连接时添加,这样您就不会尝试连接到其他端口(不需要)。但这只有在访问者首先可以连接时才会起作用。

于 2012-08-06T13:29:30.677 回答
1

您可以减少超时。fsockopen接受一个浮点数作为超时,它是以秒为单位的超时。

于 2012-08-06T13:30:08.140 回答
0

我有这个用于检测访问者端口的小功能。问题是它的速度很慢。它将页面加载时间增加了大约 3 秒,这自然是不可接受的。有人可以对此进行改进以获得更好的页面加载时间吗?

首先:每个IP执行一次,并存储连续请求的结果。然后,您可以将超时减少到半秒(使用$timeout = 0.5)。然后,确保在其中一个端口打开后立即从函数返回,这将减少等待时间,因为它会检查尽可能少的端口。最后,我建议记录哪个端口打开了一段时间,以确定哪些端口最有可能打开。您可以相应地对您的进行排序$ports。因此,如果 port808080or更有可能“打开” 3128,请确保它首先出现。

function ipProxyPortCheck($ip){
    $timeout = 0.5;
    $ports = array(80,8080,3128);
    foreach($ports as $port){
        if((@$fp = fsockopen($ip,$port,$errno,$errstr,$timeout)) !== false) {
           fclose($fp);
           return 1;
        }
    }
    return 0;
}
于 2012-08-06T13:39:43.527 回答