我正在使用一些网站来检测我的网站访问者的国家/地区。我的意思是这样的
$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
中回复,请转到{{1}}
答案 0 :(得分: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设置的控制。
您可能需要考虑卷曲,它似乎更具体一些,但我不确定CURLOPT_TIMEOUT
是否包含CURLOPT_CONNECTTIMEOUT
。
$ch = curl_init();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
答案 1 :(得分:2)
如果使用流完成此操作,则可以使用stream_set_timeout
。来自php manual的一个不错的例子,它还描述了更高级的方法:
$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;
}
}
答案 2 :(得分:1)
还有另一个解决方案,只需下载数据库并在自己的更快的机器上为自己提供该服务: