在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>"; ?>