使用PHP获取IP地址

Tri*_*tan 91 php ip-address geolocation geoip ip-geolocation

理想情况下,我正在尝试将可以从任何Web浏览器查询的PHP脚本放在一起,并返回访问PHP脚本的IP地址的国家/地区.

这可能还是有更好的解决方案?

spr*_*ain 88

您可以使用免费的简单API,例如:

哪一个看起来最值得信赖取决于你:)

否则,有些脚本基于服务器上的本地数据库.但是,数据库数据需要定期更新.看看这一个:

HTH!

编辑: 当然,根据您的项目,您可能希望查看HTML5位置功能.你不能在Internet Explorer上使用它们(IE9会支持它,还有很长的路要走),但是如果你的观众主要是在移动设备上或使用Safari/Firefox,那么绝对值得一看!

获得坐标后,您可以将它们反向地理编码为国家/地区代码.还有像这样的API:

更新,2013年4月
今天我建议使用Geocoder,这是一个PHP库,可以很容易地对IP地址和邮政地址数据进行地理编码.

***更新,2016
年9月由于Google的隐私政策已发生变化,如果您的服务器没有HTPPS证书或用户不允许您检查其位置,则无法使用HTML5 Geolocation API.所以现在你可以使用用户的IP并在PHP中签入或获得HTTPS证书.


Ben*_*ing 54

有各种Web API可以为您执行此操作.以下是使用我的服务http://ipinfo.io的示例:

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}"));
echo $details->country; // -> "US"
Run Code Online (Sandbox Code Playgroud)

Web API是一个很好的快速简便的解决方案,但是如果你需要进行大量的查找,那么在你自己的机器上安装IP - > country数据库是一个更好的解决方案.MaxMind提供了一个免费的数据库,可以与各种PHP库一起使用,包括GeoIP.

  • 我不会在生产环境中实现 ipinfo.io。我刚刚将脚本中的主要滞后确定为调用 ipinfo.io 获取 IP 详细信息的函数。请务必彻底测试您的提供商选择:) (2认同)

qua*_*ano 25

您可以从MaxMind下载ip-tables:

http://www.maxmind.com/app/geolite

将CSV导入数据库(确保为ip_long_from + ip_long_to创建索引).然后你可以简单地做:

$iplong = ip2long($_SERVER['REMOTE_ADDR']);

// should use mysqli with prepared statements etc, but just an example
mysql_query("
    SELECT country
    FROM ip_table
    WHERE $iplong BETWEEN ip_long_from AND ip_long_to
    LIMIT 1
");
Run Code Online (Sandbox Code Playgroud)


cha*_*mcs 10

这是使用http://www.geoplugin.net/json.gp的示例

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip={$ip}"));
echo $details;
Run Code Online (Sandbox Code Playgroud)


Fra*_*cis 6

您可以使用此位置API从IP地址获取国家/ 地区

    echo file_get_contents('https://ipapi.co/8.8.8.8/country/');
Run Code Online (Sandbox Code Playgroud)

响应

   US 
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴.响应是text指您country在此处查询特定字段时的情况.无需解码,只需将其插入您的代码即可.

PS如果你想要所有的字段,例如https://ipapi.co/8.8.8.8/json/,响应是JSON.

  • 我使用 https://ipapi.co/ 几个月了,但在 300-400 次查询(每天 4-5 次)之后,他们已经停止处理我的 IP(HTTP/1.1 429 请求过多)。他们网站上的信息每天 1000 次免费查询是不正确的!如果您正在寻找免费服务,我不推荐它们。 (2认同)

Joh*_*lin 5

查看“其他基本扩展”下的GeoIP功能。 http://php.net/manual/zh/book.geoip.php

  • 它们不是“真正”内置的。http://www.php.net/manual/zh/geoip.requirements.php (5认同)
  • 然后更正它。 (5认同)

iva*_*nyk 5

我看到有很多答案,但没有人提到https://freegeoip.net/

你被允许了15,000 queries per hour.我认为在大多数情况下这已经足够了.否则,您应该考虑使用MaxMind GeoIP中的本地数据库.

Freegeoip是开源的,您可以在github上找到源代码,在本地部署它们并摆脱查询限制.

此外,服务提供纬度/经度/时区和其他有用的东西.


Moh*_*ini 5

$country_code = trim(file_get_contents("http://ipinfo.io/{$ip_address}/country"))
Run Code Online (Sandbox Code Playgroud)

会给你国家代码。