转自:
http://www.cnblogs.com/scotoma/archive/2011/07/21/2112600.html
最近项目中用到了获取用户IP所在地的信息,主要是为了从IP去判断用户所在的城市,现在的城市信息基本上有分几种
获取用户IP
$_SERVER['REMOTE_ADDR']:是浏览当前页面的用户计算机的ip地址 .
最近项目中用到了获取用户IP所在地的信息,主要是为了从IP去判断用户所在的城市,现在的城市信息基本上有分几种
一种是用ID编号来关联城市的,还有使用缩写的代码来关联城市的。
我们通过IP去获取所在的用户的 城市的详细信息,比如运行以下的结果得到的是 "福建省福州市 电信"
可以得到用户的 省市及所使用的网络接入的信息
这里调用的是百度的开放查询接口,通过网页的方式去查询然后从返回的结果中去匹配我们所需要的信息,效果还行,代码在下面,还是能凑合着用的。
var_dump(getAddress('202.101.98.54','福州'));
function getAddress($ip=null,$address='') {
$url = "http://open.baidu.com/ipsearch/s?wd={$ip}&tn=baiduip";
$res = mb_convert_encoding(HttpRequest($url), 'UTF-8', 'GBK');
//var_dump($res);
if ( preg_match('#来自:<b>(.+)</b>#Ui', $res, $m) ) {
if (is_int(strpos($m[1], $address))) {
return $m[1];
}
}
}
function HttpRequest($url, $data=array()) {
$ch = curl_init();
if (is_array($data) && $data) {
$formdata = http_build_query($data);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $formdata);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
return curl_exec($ch);
}
获取用户IP
if($_SERVER['HTTP_X_FORWARDED_FOR']){
$onlineip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}elseif($_SERVER['HTTP_CLIENT_IP']){
$onlineip = $_SERVER['HTTP_CLIENT_IP'];
}else{
$onlineip = $_SERVER['REMOTE_ADDR'];
}
$onlineip = preg_match("/^[\d]([\d\.]){5,13}[\d]$/", $onlineip) ? $onlineip : 'unknown';
$_SERVER['HTTP_X_FORWARDED_FOR']:浏览当前页面的用户计算机的网关.
$_SERVER['HTTP_CLIENT_IP'] :客户端的ip.
$_SERVER['HTTP_X_FORWARDED_FOR']和$_SERVER['HTTP_CLIENT_IP'] 只有当服务器使用代理才能得到值.$_SERVER['REMOTE_ADDR']:是浏览当前页面的用户计算机的ip地址 .