分类分类
2015-04-10 09:04作者:zhao
ECSHOP官方更新了多个版本,但IP库一直没更新,版本为20071024,相当鸡肋,本升级程序读取纯真IP数据库,独有高压缩比和快速检索算法。
新版纯真IP库
升级指南
一、下载纯真IP数据库,地址一:官方下载,地址二:本站下载,下载后请重命名为ipdata.dat,覆盖至/includes/codetable/。
二、编辑/includes/lib_base.php,将函数ecs_geoip($ip)替换为
/**
*获取IP对应的地理位置
*@paramstring$ip字符串
*@returnstring
*/
functionecs_geoip($ip)
{
$return='';
if(preg_match("/^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/",$ip))
{
$iparray=explode('.',$ip);
if($iparray[0]==10||$iparray[0]==127||($iparray[0]==192&&$iparray[1]==168)||($iparray[0]==172&&($iparray[1]>=16&&$iparray[1]<=31)))
{
$return='LAN';
}
elseif($iparray[0]>255||$iparray[1]>255||$iparray[2]>255||$iparray[3]>255)
{
$return='InvalidIPAddress';
}
else
{
$tinyipfile=ROOT_PATH.'includes/codetable/ipdata.dat';//ipdata.dat-纯真网络IP库
if(@file_exists($tinyipfile))
{
$return=convertip_tiny($ip,$tinyipfile);
}
}
}
return$return;
}
functionconvertip_tiny($ip,$ipdatafile)
{
static$fp=NULL,$offset=array(),$index=NULL;
$ipdot=explode('.',$ip);
$ip=pack('N',ip2long($ip));
$ipdot[0]=(int)$ipdot[0];
$ipdot[1]=(int)$ipdot[1];
if($fp===NULL&&$fp=@fopen($ipdatafile,'rb'))
{
$offset=@unpack('Nlen',@fread($fp,4));
$index=@fread($fp,$offset['len']-4);
}
elseif($fp==FALSE)
{
return'InvalidIPdatafile';
}
$length=$offset['len']-1028;
$start=@unpack('Vlen',$index[$ipdot[0]*4].$index[$ipdot[0]*4+1].$index[$ipdot[0]*4+2].$index[$ipdot[0]*4+3]);
for($start=$start['len']*8+1024;$start<$length;$start+=8)
{
if($index{$start}.$index{$start+1}.$index{$start+2}.$index{$start+3}>=$ip)
{
$index_offset=@unpack('Vlen',$index{$start+4}.$index{$start+5}.$index{$start+6}."x0");
$index_length=@unpack('Clen',$index{$start+7});
break;
}
}
@fseek($fp,$offset['len']+$index_offset['len']-1024);
if($index_length['len'])
{
return@fread($fp,$index_length['len']);
}
else
{
return'Unknown';
}
}
相关