English 中文(简体)
时间问题:在营地的“善后”功能
原标题:time out problem with gethostbyaddr() function in php
  • 时间:2011-08-07 12:58:54
  •  标签:
  • php

最近,我注意到,在我的新的服务器上,在我的网站上使用的gethostbyaddr(功能,用于接收参考资料的接收人,这使网页的负荷较慢5倍。

当我去除时,问题已经解决了。

与这一功能和我新建立的Centos linux服务器混淆不清。

and what else i can use instead of this php function to get the host name of my referers.

问题回答

这可能是英国航天中心决议的一个暂时性缓慢,而且可能在以后明确。 除采用P.HP这样的系统外,实际还有别无选择的gethostbyaddr(。 (gethostbyaddr(>) 实质上是这一途径)

`nslookup $ip_address`
// Or
`host $ip_address`

你们可以检测到,决议是否从指挥线缓慢到:

# choose an IP address you know the resolution of...
$ host 123.123.123.123

If this doesn t return quickly you may have a DNS problem.

检查<代码>/etc/resolv.conf的内容,如果您有一台可查到的DNS服务器,则可以尝试。

我写了这一有益的替代文件,以取代Saphostbyaddr(以下简称):

//faster alternative to gethostbyaddr()
private function gethost( $ip )
{
    //Make sure the input is not going to do anything unexpected
    //IPs must be in the form x.x.x.x with each x as a number

    if( preg_match(  /^(?:25[0-5]|2[0-4]d|1dd|[1-9]d|d)(?:[.](?:25[0-5]|2[0-4]d|1dd|[1-9]d|d)){3}$/ , $ip ) )
    {
        $host = `host -s -W 1 $ip`;
        $host = ( $host ? end( explode(    , trim( trim( $host ),  .  ) ) ) : $ip );
        if( in_array( $host, Array(  reached ,  record ,  2(SERVFAIL) ,  3(NXDOMAIN)  ) ) )
        {
            return sprintf(  (error fetching domain name for %s) , $ip );
        }
        else
        {
            return $host;
        }
    }
    else
    {
        return  (invalid IP address) ;
    }
}

The trick is to use the host function, but you have to check if the $ip is a real IP to avoid exploits. I set the timout to 1 second.

它比使用“灵感”要快得多,尽管在 lo体使用时仍然缓慢。

你们拥有什么样的网络托管? 共享、甚高频或专用。 。 有一些可能减少其业绩的情景,但你仍需要至少说你使用的是哪一类。

我认为,你应当只是实施某种类型的浸 of系统,以取得霍乱(流行病)的结果。 (Well,大多数DNS服务器已建在沥滤系统中,但由于某种原因,你可能运转不灵)或试图使用替代的DNS服务器(有系统电话或改进的PHP服务器)。

不幸的是,有些草坪没有为某些吉普人地址保存逆向散射记录,因此,避风港的检查总是失败。 问题在于等待时间要等多久才结束。

一些托管服务使复发功能时差实际上很短,如果看不出成功,则将代之以主名。 这加快了步伐,防止了长期拖延显示这一功能的网页。

你们应始终仔细检查没有显示东道国名的标识,因为它们经常表明,来访者来自一个有名声的互联网活动。

http://php.net/manual/en/Function.gethostbyaddr.php rel=“nofollow noreferer”>gethostbyaddr() 不能支持停职,我的主任安排不允许空壳指挥。 我决定使用一个当地版本:

<?php
$ip = isset($_GET[ ip ]) ? filter_var($_GET[ ip ], FILTER_VALIDATE_IP) : false;
if ($ip) {
    echo json_encode(gethostbyaddr($ip));
}
?>

现在,我向这个<代码>API.php发出请求。 rel=“nofollow noreferer”>file_get_contents( 如下:

<?php
// prepare host url
function isSecure() {
    return ((isset($_SERVER[ HTTPS ]) && !empty($_SERVER[ HTTPS ]) && $_SERVER[ HTTPS ] !==  off ) || $_SERVER[ SERVER_PORT ] == 443) ?  s  :   ;
}
$protocol_host =  http  . isSecure() .  ://  . filter_input(INPUT_SERVER,  HTTP_HOST , FILTER_SANITIZE_URL);
// dns request
$context = stream_context_create(array(
     http  => array(
         timeout  => 0.4,// 400 ms
    )
));
$ip = long2ip(mt_rand(0, "4294967295"));
// note: the host url needs public access!
$host = json_decode(@file_get_contents($protocol_host .  /hostAPI.php?ip=  . $ip, false, $context), true);
// output
echo  IP:   . $ip . "<br>
";
echo  HOST:   . ($host ? $host :  Timeout! ) . "<br>
";
echo  Execution Time:   . round((microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"])  * 1000) .   ms ;
?>

As you can see I set the timeout through stream_context_create().

Sample output:

IP: 56.152.200.204
HOST: Timeout!
Execution Time: 801 ms

IP: 81.139.131.130
HOST: host81-139-131-130.range81-139.btcentralplus.com
Execution Time: 52 ms

我不知道为什么,但在我设置的<代码><0.4/code>时,后面加固了800个圆顶,因此,我需要把最终停下来的价值增加一倍。 也许其他人可以评论这一点。

Warning
This creates one additional http request on your server for every request on your main script!

在从XP升级到7之后,PHP对IPv4和IPv6进行了处理(例如,127.0.0.1和1) 我已经修改了一些法典,以暂时解决这一问题。 由此可见,我正在使用IPv6号配送的<代码>gethostbyaddr,因此,在PHP的时间安排上已经停顿。

......

$ip = ip2long6($ip);
$host = gethostbyaddr($ip);

......

$host = gethostbyaddr($_SERVER[ REMOTE_ADDR ]);

你们可以利用Xdebug和WinCacheGrind(我利用XAMPP进行当地测试),寻找时间,这里是快速运行的录像辅导。

http://www.warpconduit.net/2007/09/01/quick-tip-profiling-php-applications-with-xdebug-wincachegrind-xampp-for-windows/

希望能拯救某个人。





相关问题
Brute-force/DoS prevention in PHP [closed]

I am trying to write a script to prevent brute-force login attempts in a website I m building. The logic goes something like this: User sends login information. Check if username and password is ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

定值美元

如何确认来自正确来源的数字。

Generating a drop down list of timezones with PHP

Most sites need some way to show the dates on the site in the users preferred timezone. Below are two lists that I found and then one method using the built in PHP DateTime class in PHP 5. I need ...

Text as watermarking in PHP

I want to create text as a watermark for an image. the water mark should have the following properties front: Impact color: white opacity: 31% Font style: regular, bold Bevel and Emboss size: 30 ...

How does php cast boolean variables?

How does php cast boolean variables? I was trying to save a boolean value to an array: $result["Users"]["is_login"] = true; but when I use debug the is_login value is blank. and when I do ...

热门标签