您当前的位置:首页 > 网站建设笔记 >

PHP的网络应用 进行IP定位

来源:PHP5高级应用开发实践0

在PHP新闻组里,经常会看到的一个问题是如何判断用户所在的国家。虽然PHP所在的服务器与访问服务器的用户都可能位于世界上的任何位置,但还是可能实现地理匹配的,其前提如下。每台计算机都必须有一个IP地址才能访问互联网(或连接到任何网络)。互联网服务供应商(ISP)从一个有效IP地址池里向访问它的计算机分配一个IP地址。通过了解计算机的IP地址(PHP把这个地址保存在$_SERVER['REMOTE_ADDR']里),我们就能知道ISP,从而判断出用户所在的国家。这就被称为“IP地位”。新的GeoIP数据库甚至能够推算出城市和州,但精度不是很高。实现这种功能的最简单方式是使用PEAR的Net_Geo类,它使用在线服务来获取IP地址的相应信息。这个类有一些缺点,后面将有相关说明。下面这个范例将使用另一个与网络相关的PHP函数:gethostbyname(),它会返回指定域名的IP地址。

选择IP定位的方式
Net_Geo类所使用的在线资源并不是实时更新的,所以它的准确度会随时间推移不断降低。但从轻松地展示IP定位概念的角度来说,它还是个不错的选择。另一个更精确的方式是使用PEAR的Net_GeoIP类,这个类依赖于商业数据库来达到最佳精度和提供最好的信息。事实上,如果需要编写一个依赖于IP地位的程序,我们一般会愿意为商业数据库支付一定费用,从而达到最高的精确性。

确定用户的位置,使用PEAR的Net_Geo类,根据IP地址获得地理位置信息

<?php
require_once("Net/Geo.php");
$net_geo = new Net_Geo();
$ip = $_SERVER["REMOTE_ADDR"];
$results = $net_geo->getRecord($ip);

echo "<ul>";
echo "<li>IP Address: $ip</li>";
echo "<li>Country: {$results['COUNTRY']}</li>";
echo "<li>City: {$results['CITY']}</li>";
echo "<li>State: {$results['STATE']}</li>";
echo "<li>Latitude: {$results['LAT']}</li>";
echo "<li>Longitude: {$results['LONG']}</li>";
echo "</ul>";

$url = "www.wangzhanchengxu.com";
$ip = gethostbyname($url);
$results = $net_geo->getRecord($ip);

echo "<ul>";
echo "<li>IP Address: $ip</li>";
echo "<li>Country: {$results['COUNTRY']}</li>";
echo "<li>City: {$results['CITY']}</li>";
echo "<li>State: {$results['STATE']}</li>";
echo "<li>Latitude: {$results['LAT']}</li>";
echo "<li>Longitude: {$results['LONG']}</li>";
echo "</ul>";
?>
  • 有资料表明,IP地位在国家一级是相当准确的,大约能够达到95%。在城市和州一级,准确性就下降到50%到80%,具体情况取决于所使用的数据库。在本例中,脚本并没有准确地找到我所在的城市,而是定位到20英里外的另一个城市(属于另一个州)。正如前面提到过的,使用商业数据库会获得更准确的结果。
  • 如果想知道IP地址所对应的主机名称,可以使用gethostbyaddr()函数。
  • 如果某个URL包含多台服务器,gethostbyname()函数会返回全部可能的IP地址,然后我们就可以确定每个IP地址的位置。
顶部中部底部