获取具有本机PHP的IP的国家/地区位置

时间:2010-03-18 07:46:23

标签: geolocation dreamhost whois

在您说这是重复之前继续阅读,但事实并非如此。 (据我所知)

我想从客户端获取php中的县代码。

是的我知道你可以使用外部网站或“geoip_record_by_name”这样做,但我不想依赖外部网站,我不能使用碎片安装“梨”作为我Dreamhost托管。

我以为我可以做这样的事情:

$output = shell_exec('whois '.$ip.' -H | grep country | awk \'{print $2}\'');
echo "<pre>$output</pre>";

但是dreamhost似乎有一个旧版本的whois(4.7.5),所以我在分配的IP上出现了这个错误:

Unknown AS number or IP network. Please upgrade this program.

因此,除非有人知道如何将更新版本的whois的二进制文件放到dreamhost上,否则就会卡住。

或者是否有另一种方法可以从正在加载页面的客户端获取国家/地区代码?

8 个答案:

答案 0 :(得分:27)

Whois只是whois服务的客户端,因此从技术上讲,您仍然依赖于外部网站。对于失败的查询,您可以尝试回退到查询的另一个站点,例如hostip.info,它恰好有一个不错的API并且看起来很友好:

http://api.hostip.info/country.php?ip=4.2.2.2

返回

US
祝你好运,

- JED

编辑:@Mint以下是hostip.info上API的链接:http://www.hostip.info/use.html

答案 1 :(得分:18)

MaxMind提供免费PHP GeoIP country lookup class(还有一个免费的国家+城市查询)。

您想要的位是“纯PHP模块”中提到的。这不需要您安装任何东西,也不需要依赖它们,也不需要安装任何特殊的PHP模块。只需将GeoIP数据文件保存在某处,然后使用他们提供的类与之交互。

答案 2 :(得分:2)

您是否可以将whois的副本安装到主目录中并将完整路径传递给shell_exec?这样你就不会受到升级计划的限制。

答案 3 :(得分:2)

您的问题的另一种有点极端的解决方案是:

  1. 下载MaxMind的country database
  2. 的CSV格式版本
  3. 使用脚本从中删除CSV中不需要的信息。
  4. ...生成一个标准的PHP文件,其中包含一个数据结构,其中包含IP地址作为密钥,国家/地区代码作为值。
  5. 将生成的文件包含在您常用的项目文件中,您现在拥有一个完全内部的IP =&gt;国家代码查询表。
  6. 缺点是,您需要定期从最新版本的数据库重新生成PHP文件。此外,这是一个非常讨厌的方式,一般来说,性能可能不是最好的:)

答案 4 :(得分:1)

考虑ipcountryphp (我的网站,我的代码,我的荣誉)因为它提供了本地互联网生命周期免费更新的数据库。它快速且完全独立,可插入任何PHP 5.3,SQLite3及更高版本。寻求速度非常快,没有性能损失。

足够无耻的自我推销,让我们认真对待:

依赖于实时查询远程服务以使访问者国家成为您网站功能的主要瓶颈,具体取决于查询服务器的响应速度。根据经验,您永远不应该查询外部服务的实时网站功能(如页面加载)。在后台使用API​​非常棒,但是当您需要在呈现页面之前查询每个访问者的国家/地区时,您会让自己陷入痛苦的世界。 请记住,你并不是唯一一个滥用免费服务的人:)

所以对第三方服务的查询保留在后台,而只有依赖于第三方的本地功能才会进入用户与之交互的层。只是我稍微表现出偏执的态度:)

PS 我写的上述脚本也支持IPv6。

答案 5 :(得分:0)

这是一个我刚刚使用的脚本网站。唯一的问题是,您可能偶尔需要自己重新生成IP ...这可能会让每个人都告诉您使用外部API的原因很痛苦。但对我来说,这不是解决方案,因为我一次拉动50个IP,这意味着我可能会被禁止。因此解决方案是使用我自己的脚本或对数据库执行保存,但我再次从外部网站提取图像。无论如何这里是我发现脚本的网站:

http://coding-talk.com/f29/country-flag-script-8882/

答案 6 :(得分:0)

答案 7 :(得分:0)

这里也是其中之一。只需将IP更改为变量:
http://api.codehelper.io/ips/?callback=codehelper_ip_callback&ip=143.3.87.193