17

在你说这是重复之前请继续阅读,它不是。(据我所知)

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

是的,我知道您可以使用外部站点或“geoip_record_by_name”之类的站点来执行此操作,但我不想依赖外部站点,并且我无法像使用碎片 Dreamhost 托管那样为 php 安装“pear”。

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

$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 上,否则我会卡住。

或者有没有其他方法可以从加载页面的客户那里获取国家代码?

4

8 回答 8

27

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

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

返回

US

祝你好运,

——杰德

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

于 2010-03-23T02:15:58.580 回答
18

MaxMind 提供免费的PHP GeoIP 国家查询类(也有免费的国家+城市查询类)。

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

于 2010-03-18T08:08:44.727 回答
2

您可以将 whois 的副本安装到您​​的主目录并将完整路径传递给 shell_exec 吗?这样您就不会受制于他们的升级计划。

于 2010-03-18T08:01:59.783 回答
2

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

  1. 下载 MaxMind国家数据库的 CSV 格式版本
  2. 使用脚本从 CSV 中删除您不需要的信息,然后...
  3. ...生成一个标准的 PHP 文件,其中包含一个数据结构,其中 IP 地址作为键,国家代码作为值。
  4. 将生成的文件包含在您通常的项目文件中,您现在拥有一个完全内部的 IP => 国家代码查找表。

缺点是,您经常需要从最新版本的数据库重新生成 PHP 文件。此外,一般来说,这是一种非常讨厌的方式,性能可能不是最好的:)

于 2010-03-25T23:26:40.853 回答
1

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

够了无耻的自我推销,让我们认真点:

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

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

PS上面提到的我写的脚本也支持 IPv6。

于 2013-04-09T05:26:17.603 回答
0

这是一个带有我刚刚使用的脚本的站点。唯一的问题是您可能不时需要自己重新生成 IP……这可能是每个人都告诉您使用外部 API 的痛苦和理由。但对我来说,这不是解决方案,因为我一次要提取 50 个 IP,这意味着我可能会被禁止。所以解决方案是使用我自己的脚本或保存到数据库,但我再次从外部站点提取图像。无论如何,这是我在上面找到脚本的网站:

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

于 2012-08-28T12:20:29.837 回答
0

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

于 2013-12-17T18:03:53.253 回答