我想从访问者的IP地址中检索他们的城市、州和国家等信息,这样我就可以根据他们的位置定制我的网页。在PHP中是否有一种好的、可靠的方法来做到这一点?我使用JavaScript作为客户端脚本,PHP作为服务器端脚本,MySQL作为数据库。
当前回答
执行IP地理定位有两种广泛的方法:一种是下载数据集,将其托管在基础设施上并保持最新。这需要时间和精力,特别是当您需要支持大量请求时。另一种解决方案是使用现有的API服务来为您管理所有工作。
有许多API地理定位服务:Maxmind, Ip2location, Ipstack, IpInfo等。最近,我工作的公司已经切换到Ipregistry (https://ipregistry.co),我参与了决策和实施过程。下面是一些你在寻找IP地理定位API时应该考虑的元素:
服务准确吗?他们是否使用单一的信息来源? 他们真的能承受你的负担吗? 它们是否在全球范围内提供一致且快速的响应时间(除非您的用户是特定国家的用户)? 他们的定价模式是什么?
下面是一个获取IP地理位置信息的例子(还包括威胁和用户代理数据,使用一个调用):
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("https://api.ipregistry.co/{$ip}?key=tryout"));
echo $details->location;
注:我不是在这里推广Ipregistry并说它是最好的,但我花了很长时间分析现有的解决方案,他们的解决方案真的很有前途。
其他回答
我想我张贴,因为似乎没有人给这个特定的API的信息,但它返回的正是我所追求的,你可以让它以多种格式返回,json, xml和csv。
$location = file_get_contents('http://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']);
print_r($location);
这将给你所有你可能想要的东西:
{
"ip": "77.99.179.98",
"country_code": "GB",
"country_name": "United Kingdom",
"region_code": "H9",
"region_name": "London, City of",
"city": "London",
"zipcode": "",
"latitude": 51.5142,
"longitude": -0.0931,
"metro_code": "",
"areacode": ""
}
我已经用IP地址服务做了很多测试,下面是我自己做的一些方法。 首先是一些我使用的有用网站的链接:
https://db-ip.com/db 有一个免费的ip查找服务和有一些免费的csv文件你可以 下载。这使用一个免费的api密钥,是附加到您的电子邮件。它限制每天查询2000次。
http://ipinfo.io/ 免费的ip查找服务,没有api键 PHP函数:
//uses http://ipinfo.io/.
function ip_visitor_country($ip){
$ip_data_in = get_web_page("http://ipinfo.io/".$ip."/json"); //add the ip to the url and retrieve the json data
$ip_data = json_decode($ip_data_in['content'],true); //json_decode it for php use
//this ip-lookup service returns 404 if the ip is invalid/not found so return false if this is the case.
if(empty($ip_data) || $ip_data_in['httpcode'] == 404){
return false;
}else{
return $ip_data;
}
}
function get_web_page($url){
$user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0';
$options = array(
CURLOPT_CUSTOMREQUEST =>"GET", //set request type post or get
CURLOPT_POST =>false, //set to GET
CURLOPT_USERAGENT => $user_agent, //set user agent
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
$httpCode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
curl_close( $ch );
$header['errno'] = $err; //curl error code
$header['errmsg'] = $errmsg; //curl error message
$header['content'] = $content; //the webpage result (In this case the ip data in json array form)
$header['httpcode'] = $httpCode; //the webpage response code
return $header; //return the collected data and response codes
}
最后你会得到这样的结果:
Array
(
[ip] => 1.1.1.1
[hostname] => No Hostname
[city] =>
[country] => AU
[loc] => -27.0000,133.0000
[org] => AS15169 Google Inc.
)
http://www.geoplugin.com/ 稍微有点老,但这项服务给你一大堆额外有用的信息,如货币离开国家,大陆代码,经度等。
http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude 提供了一堆可下载的文件,并附有将它们导入数据库的说明。 一旦在数据库中有了这些文件中的一个,就可以相当容易地选择数据。
SELECT * FROM `ip2location_db5` WHERE IP > ip_from AND IP < ip_to
使用php函数ip2long();将ip-address转换为数值。例如,1.1.1.1变成16843009。这允许您扫描数据库文件提供给您的ip范围。
因此,为了找出1.1.1.1属于哪里,我们所要做的就是运行这个查询:
SELECT * FROM `ip2location_db5` WHERE 16843009 > ip_from AND 16843009 < ip_to;
这将返回此数据作为示例。
FROM: 16843008
TO: 16843263
Country code: AU
Country: Australia
Region: Queensland
City: Brisbane
Latitude: -27.46794
Longitude: 153.02809
您可以下载免费的GeoIP数据库并在本地查找IP地址,也可以使用第三方服务并执行远程查找。这是一个更简单的选项,因为它不需要设置,但它确实引入了额外的延迟。
你可以使用的第三方服务是我的,http://ipinfo.io。它们提供主机名、地理位置、网络所有者和其他信息,例如:
$ curl ipinfo.io/8.8.8.8
{
"ip": "8.8.8.8",
"hostname": "google-public-dns-a.google.com",
"loc": "37.385999999999996,-122.0838",
"org": "AS15169 Google Inc.",
"city": "Mountain View",
"region": "CA",
"country": "US",
"phone": 650
}
下面是一个PHP示例:
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
echo $details->city; // -> "Mountain View"
您也可以在客户端使用它。下面是一个简单的jQuery示例:
$.get("https://ipinfo.io/json", function (response) { $("#ip").html("IP: " + response.ip); $("#address").html("Location: " + response.city + ", " + response.region); $("#details").html(JSON.stringify(response, null, 4)); }, "jsonp"); <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <h3>Client side IP geolocation using <a href="http://ipinfo.io">ipinfo.io</a></h3> <hr/> <div id="ip"></div> <div id="address"></div> <hr/>Full response: <pre id="details"></pre>
执行IP地理定位有两种广泛的方法:一种是下载数据集,将其托管在基础设施上并保持最新。这需要时间和精力,特别是当您需要支持大量请求时。另一种解决方案是使用现有的API服务来为您管理所有工作。
有许多API地理定位服务:Maxmind, Ip2location, Ipstack, IpInfo等。最近,我工作的公司已经切换到Ipregistry (https://ipregistry.co),我参与了决策和实施过程。下面是一些你在寻找IP地理定位API时应该考虑的元素:
服务准确吗?他们是否使用单一的信息来源? 他们真的能承受你的负担吗? 它们是否在全球范围内提供一致且快速的响应时间(除非您的用户是特定国家的用户)? 他们的定价模式是什么?
下面是一个获取IP地理位置信息的例子(还包括威胁和用户代理数据,使用一个调用):
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("https://api.ipregistry.co/{$ip}?key=tryout"));
echo $details->location;
注:我不是在这里推广Ipregistry并说它是最好的,但我花了很长时间分析现有的解决方案,他们的解决方案真的很有前途。
我在IPLocate上运行服务。Io,你可以通过一个简单的电话免费连接到它:
<?php
$res = file_get_contents('https://www.iplocate.io/api/lookup/8.8.8.8');
$res = json_decode($res);
echo $res->country; // United States
echo $res->continent; // North America
echo $res->latitude; // 37.751
echo $res->longitude; // -97.822
var_dump($res);
$res对象将包含您的地理位置字段,如国家、城市等。
查看文档了解更多信息。
推荐文章
- 原则-如何打印出真正的sql,而不仅仅是准备好的语句?
- 如何从关联PHP数组中获得第一项?
- PHP/MySQL插入一行然后获取id
- 我如何排序一个多维数组在PHP
- 如何在PHP中截断字符串最接近于一定数量的字符?
- PHP错误:“zip扩展名和unzip命令都没有,跳过。”
- Nginx提供下载。php文件,而不是执行它们
- Json_encode()转义正斜杠
- 如何在PHP中捕获cURL错误
- Linux命令将域名转换为IP
- 如何要求一个分叉与作曲家?
- 如何在php中创建可选参数?
- 在文本文件中创建或写入/追加
- 为什么PHP的json_encode函数转换UTF-8字符串为十六进制实体?
- 如何从一个查询插入多行使用雄辩/流利