//获取IP和根据IP获取地址并赋值
$data['ip']=Common::GetIP();
$data['location']=$this->GetAddress($data['ip']);
//获取访客的IP地址
public function GetIP()
{
$ip=false;
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
if($ip){
array_unshift($ips, $ip); $ip = FALSE;
}
for($i = 0; $i < count($ips); $i++){
if (!eregi ("^(10|172\.16|192\.168)\.", $ips[$i])){
$ip = $ips[$i];
break;
}
}
}
return($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}
//根据IP获取所在城市(采用淘宝接口)
public function getAddress($clientIP){
$taobaoIP = 'http://ip.taobao.com/service/getIpInfo.php?ip='.$clientIP;
$IPinfo = json_decode(file_get_contents($taobaoIP));
$province = $IPinfo->data->region;
$city = $IPinfo->data->city;
$data = $province.$city;
return $data;
}
连续多次获取的时候会偶尔发生相应缓慢的情况,新浪的接口会稍好一些(可能用户比较少),我采用了在前置方法中写入session的方法来规避多次调用淘宝接口。
if(!session('location')){
$ip=$this->GetIP();
$location=$this->GetAddress($ip);
session('location',$location);
}
前端调用(thinkphp5.0)
{$Request.session.location}