我已经从http://www.wipmania.com/en/base/下载了WIPmania的worldip表--该表有3个字段和大约79000行:
3363110912
假设我在阿根廷,我的IP地址是: 200.117.248.17
1)我使用这个函数将我的ip转换成long
function ip_address_to_number($ip) {
if(!$ip) {
return false;
} else {
$ip = split('\.',$ip);
return($ip[0]*16777216 + $ip[1]*65536 + $ip[2]*256 + $ip[3]);
}
}2) I通过匹配经过长时间转换的ip来搜索适当的国家代码:
$sql = 'SELECT * FROM worldip WHERE '.ip_address_to_number($_SERVER['REMOTE_ADDR']).' BETWEEN startip AND endip';这相当于:从worldip中选择了一个国家,在那里,星端和endip之间为3363174417 (基准:显示行0-0 (1次总计,查询耗时0.2109秒))。
现在,真正的问题出现了。
如果另一群阿根廷人也打开网站,他们都有这些ip地址,那该怎么办呢?
由于我正在缓存所有sql查询;与其匹配数据库中的每个ip查询,不如通过这样修改函数来匹配ip的前2部分(也是正确的)吗?
function ip_address_to_number($ip) {
if(!$ip) {
return false;
} else {
$ip = split('\.',$ip);
return($ip[0]*16777216 + $ip[1]*65536);
}
}(注意,IP的第3和第4分裂值已被删除)。
这样就不用查询这4个值了:
我必须查询的...all是: 3363110912 (这是200.117。0.0转换为long)。
是这样的吗?还有其他方法来优化这个过程吗?
发布于 2010-06-17 17:02:46
你一定要使用WIPmania吗?如果不是,Maxmind提供了一个开源解决方案:http://www.maxmind.com/app/geolitecountry。它的优点是它是一个二进制文件,并且有一个PHP扩展名(您必须编译它并安装它)。在几个项目中使用它,查找的速度很快。您可以在这里获得PCL扩展:http://pecl.php.net/package/geoip
发布于 2010-06-17 15:53:15
不是的。
193.150.1.1 -俄罗斯IP 193.150.230.1 -瑞典IP
你可能会把它截断到前三位,但是.你不会有那么多的缓存点击。而且很有可能一些/24网络被分成两个部分。有时,会给出比/24小的块。
https://stackoverflow.com/questions/3063192
复制相似问题