4

我正在使用一些网站来检测我的网站访问者所在的国家/地区。我的意思是这样

$ip = $_SERVER['REMOTE_ADDR'];  
$url1 = 'http://api.hostip.info/get_json.php?ip='.$ip;
$url2 = 'http://ip2country.sourceforge.net/ip2c.php?format=JSON&ip='.$ip;

有时像 sourgeforge 这样的网站会花费太多时间来加载。

那么任何人都可以告诉如何限制http响应时间。?

如果url1已关闭或未响应,x seconds则移至url2,url3,etc

4

3 回答 3

5
$context  = stream_context_create(array(
    'http' => array(
        'method'  => 'GET',
      , 'timeout' => 3 
    )
));

然后将流上下文提供给 fopen() 或 file_get_contents() 等...

http://php.net/manual/en/stream.contexts.php
http://php.net/manual/en/context.http.php

该手册称其为“读取超时”。我担心它可能不包括 dns 解析 + 套接字连接之类的时间。我认为 php 尝试从流中读取之前的超时可能由default_socket_timeout设置控制。

您可能要考虑 curl,它似乎更具体一些,但我不确定是否CURLOPT_TIMEOUT包含CURLOPT_CONNECTTIMEOUT.

$ch = curl_init();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);

http://php.net/manual/en/function.curl-setopt.php

于 2012-12-25T17:57:39.223 回答
2

如果这是使用流完成的,您可以使用stream_set_timeout它。php 手册中的一个不错的示例,它还描述了更高级的归档方法:

$fp = fsockopen("www.example.com", 80);
if (!$fp) {
    echo "Unable to open\n";
} else {

    fwrite($fp, "GET / HTTP/1.0\r\n\r\n");
    stream_set_timeout($fp, 2);
    $res = fread($fp, 2000);

    $info = stream_get_meta_data($fp);
    fclose($fp);

    if ($info['timed_out']) {
        echo 'Connection timed out!';
    } else {
        echo $res;
    }

}  
于 2012-12-25T17:54:32.437 回答
1

还有另一种解决方案,只需下载数据库并在自己更快的机器上为自己提供该服务:

IP 到地理位置数据库

于 2012-12-25T21:45:19.917 回答