php ip转换省市县

Posted vip-deng-vip

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php ip转换省市县相关的知识,希望对你有一定的参考价值。

http://www.cz88.net/ip/

http://www.ttlsa.com/php/php_cunzhen-ipdata/

 

 

#  wget h http://6.scdx3.crsky.com/201307/qqwry0715.zip
#  unzip qqwry0715.zip
#  mv ip/qqwry.dat /data/site/test.ttlsa.com/qqwry.dat

 

 

p
class cls_ipAddress
private $fp;
private $firstip;
private $lastip;
private $totalip;

public function __construct($filename="qqwry.dat")
$this->fp=0;
if(($this->fp=@fopen($filename,"rb"))!==false)
$this->firstip=$this->getlong();
$this->lastip=$this->getlong();
$this->totalip=($this->lastip-$this->firstip)/7;
register_shutdown_function(array(&$this,"__destruct"));

public function __destruct()
if($this->fp)
@fclose($this->fp);

$this->fp=0;

private function getlong()
$result=unpack("Vlong",fread($this->fp,4));
return $result["long"];

private function getlong3()
$result=unpack("Vlong",fread($this->fp,3).chr(0));
return $result["long"];

private function packip($ip)
return pack("N",intval(ip2long($ip)));

private function getstring($data="")
$char=fread($this->fp,1);
while(ord($char)>0)
$data.=$char;
$char=fread($this->fp,1);

return $data;

private function getarea()
$byte=fread($this->fp,1);
switch(ord($byte))
case 0:
$operators="";
break;
case 1:
case 2:
fseek($this->fp,$this->getlong3());
$operators=$this->getstring();
break;
default:
$operators=$this->getstring($byte);
break;
return $operators;

public function getlocation($ip)
if(!$this->fp)return null;
$location["ip"]=gethostbyname($ip);
$ip=$this->packip($location["ip"]);
$l=0;
$u=$this->totalip;
$findip=$this->lastip;
while($l<=$u)
$i=floor(($l+$u)/2);
fseek($this->fp,$this->firstip+$i*7);
$startip=strrev(fread($this->fp,4));
if($ip<$startip)
$u=$i-1;
else
fseek($this->fp,$this->getlong3());
$endip=strrev(fread($this->fp,4));
if($ip>$endip)
$l=$i+1;
else
$findip=$this->firstip+$i*7;
break;



fseek($this->fp,$findip);
$location["startip"]=long2ip($this->getlong());
$offset=$this->getlong3();
fseek($this->fp,$offset);
$location["endip"]=long2ip($this->getlong());
$byte=fread($this->fp,1);
switch(ord($byte))
case 1:
$countryOffset=$this->getlong3();
fseek($this->fp,$countryOffset);
$byte=fread($this->fp,1);
switch(ord($byte))
case 2:
fseek($this->fp,$this->getlong3());
$location["area"]=$this->getstring();
fseek($this->fp,$countryOffset+4);
$location["operators"]=$this->getarea();
break;
default:
$location["area"]=$this->getstring($byte);
$location["operators"]=$this->getarea();
break;
break;
case 2:
fseek($this->fp,$this->getlong3());
$location["area"]=$this->getstring();
fseek($this->fp,$offset+8);
$location["operators"]=$this->getarea();
break;
default:
$location["area"]=$this->getstring($byte);
$location["operators"]=$this->getarea();
break;
if($location["area"]=="CZ88.NET")
$location["area"]="未知";

if($location["operators"]=="CZ88.NET")
$location["operators"]="未知";

return $location;

以上是关于php ip转换省市县的主要内容,如果未能解决你的问题,请参考以下文章

php的IP转换成整型函数ip2long()易出现负数

PHP转换IP地址到真实地址的方法详解

php 正则匹配省市区

省市区(县)三级联动

省市区(县)三级联动

IP地址转换为整型数字的PHP方法Asp方法和MsSQL方法MySQL方法