知识大全 解析php根据ip查询所在地区

Posted 地址

篇首语:拳不离手,曲不离口。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 解析php根据ip查询所在地区相关的知识,希望对你有一定的参考价值。

  dat文件 关于ip对应地区的信息文件 qqwry dat文件 网上自己下载 class类文件 解析qqwry data文件的 IpLocation php文件

复制代码 代码如下: <?php class IpLocation /** * @var resource 指针 */ private $fp; /** * 第一条IP记录的偏移地址 * @var int */ private $firstip; /** * 最后一条IP记录的偏移地址 * @var int */ private $lastip; /** * IP记录的总条数(不包含版本信息记录) * @var int */ private $totalip; /** * 构造函数 打开 QQWry Dat 文件并初始化类中的信息 * @param string $filename * @return IpLocation */ public function __construct($filename = "qqwry dat") $this >fp = ; if (($this >fp = @fopen($filename rb )) !== false) $this >firstip = $this >getlong(); $this >lastip = $this >getlong(); $this >totalip = ($this >lastip $this >firstip) / ; /** * 返回读取的长整型数 * @access private * @return int */ public function getlong() //将读取的little endian编码的 个字节转化为长整型数 $result = unpack( Vlong fread($this >fp )); return $result[ long ]; /** * 返回读取的 个字节的长整型数 * * @access private * @return int */ public function getlong () //将读取的little endian编码的 个字节转化为长整型数 $result = unpack( Vlong fread($this >fp ) chr( )); return $result[ long ]; /** * 返回压缩后可进行比较的IP地址 * * @access private * @param string $ip * @return string */ public function packip($ip) // 将IP地址转化为长整型数 如果在PHP 中 IP地址错误 则返回False // 这时intval将Flase转化为整数 之后压缩成big endian编码的字符串 return pack( N intval(ip long($ip))); /** * 返回读取的字符串 * * @access private * @param string $data * @return string */ public function getstring($data = "") $char = fread($this >fp ); while (ord($char) > ) // 字符串按照C格式保存 以结束 $data = $char; // 将读取的字符连接到给定字符串之后 $char = fread($this >fp ); return mb_convert_encoding($data utf gb ); /** * 返回地区信息 * * @access private * @return string */ public function getarea() $byte = fread($this >fp ); // 标志字节 switch (ord($byte)) case : // 没有区域信息 $area = ""; break; case : case : // 标志字节为 或 表示区域信息被重定向 fseek($this >fp $this >getlong ()); $area = $this >getstring(); break; default: // 否则 表示区域信息没有被重定向 $area = $this >getstring($byte); break; return $area; /** * 根据所给 IP 地址或域名返回所在地区信息 * @access public * @param string $ip * @return array */ function getlocation($ip) if (!$this >fp) return null; // 如果数据文件没有被正确打开 则直接返回空 $location[ ip ] = gethostbyname($ip); // 将输入的域名转化为IP地址 $ip = $this >packip($location[ ip ]); // 将输入的IP地址转化为可比较的IP地址 // 不合法的IP地址会被转化为 // 对分搜索 $l = ; // 搜索的下边界 $u = $this >totalip; // 搜索的上边界 $findip = $this >lastip; // 如果没有找到就返回最后一条IP记录(QQWry Dat的版本信息) while ($l <= $u) // 当上边界小于下边界时 查找失败 $i = floor(($l + $u) / ); // 计算近似中间记录 fseek($this >fp $this >firstip + $i * ); $beginip = strrev(fread($this >fp )); // 获取中间记录的开始IP地址 // strrev函数在这里的作用是将little endian的压缩IP地址转化为big endian的格式 // 以便用于比较 后面相同 if ($ip < $beginip) // 用户的IP小于中间记录的开始IP地址时 $u = $i ; // 将搜索的上边界修改为中间记录减一 else fseek($this >fp $this >getlong ()); $endip = strrev(fread($this >fp )); // 获取中间记录的结束IP地址 if ($ip > $endip) // 用户的IP大于中间记录的结束IP地址时 $l = $i + ; // 将搜索的下边界修改为中间记录加一 else // 用户的IP在中间记录的IP范围内时 $findip = $this >firstip + $i * ; break; // 则表示找到结果 退出循环 //获取查找到的IP地理位置信息 fseek($this >fp $findip); $location[ beginip ] = long ip($this >getlong()); // 用户IP所在范围的开始地址 $offset = $this >getlong (); fseek($this >fp $offset); $location[ endip ] = long ip($this >getlong()); // 用户IP所在范围的结束地址 $byte = fread($this >fp ); // 标志字节 switch (ord($byte)) case : // 标志字节为 表示国家和区域信息都被同时重定向 $countryOffset = $this >getlong (); // 重定向地址 fseek($this >fp $countryOffset); $byte = fread($this >fp ); // 标志字节 switch (ord($byte)) case : // 标志字节为 表示国家信息又被重定向 fseek($this >fp $this >getlong ()); $location[ country ] = $this >getstring(); fseek($this >fp $countryOffset + ); $location[ area ] = $this >getarea(); break; default: // 否则 表示国家信息没有被重定向 $location[ country ] = $this >getstring($byte); $location[ area ] = $this >getarea(); break; break; case : // 标志字节为 表示国家信息被重定向 fseek($this >fp $this >getlong ()); $location[ country ] = $this >getstring(); fseek($this >fp $offset + ); $location[ area ] = $this >getarea(); break; default: // 否则 表示国家信息没有被重定向 $location[ country ] = $this >getstring($byte); $location[ area ] = $this >getarea(); break; if ($location[ country ] == " CZ NET") // CZ NET表示没有有效信息 $location[ country ] = "未知"; if ($location[ area ] == " CZ NET") $location[ area ] = ""; return $location; /** * 析构函数 用于在页面执行结束后自动关闭打开的文件 * */ function __desctruct() if ($this >fp) fclose($this >fp); $this >fp = ; ?>

   这个也可以网上下载 也可以copy这里的 这里的也是很全的 执行文件 我这里叫ip_location php文件

复制代码 代码如下: cha138/Article/program/PHP/201311/20884

相关参考

知识大全 PHP用CURL伪造IP和来源

PHP用CURL伪造IP和来源  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  php代码  $c

知识大全 通过手机QQ查询ip怎么办 我妹妹不见了

很急通过手机QQ查询ip怎么办我妹妹不见了!  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!很急通过

知识大全 用php来获得客户端服务器ip的方法

  <?php  echo"当前脚本服务器的主机名"gethostbyaddr($_SERVER[REMOTE_ADDR])"<br/><hr/>";echo"获得当前运

知识大全 将IP地址转换为整型数字的PHP方法、Asp方法和MsSQL方法、MySQL方法

将IP地址转换为整型数字的PHP方法、Asp方法和MsSQL方法、MySQL方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容

知识大全 php小经验:解析preg

  正则表达式在PHP中的应用在PHP应用中正则表达式主要用于•正则匹配根据正则表达式匹配相应的内容•正则替换根据正则表达式匹配内容并替换•正则分割根据正则表达式分割字符串在PHP中有两类正则表达式函

失业保险金查询方法

可以根据如下情况,自行选择查询方式。1.社保中心查询如果对自己的社保帐号不清楚,可以携带身份证到各区社会保险经办机构业务办理大厅查询。2.上网查询登陆所在城市的劳动保障网或社会保险业务网站,点击“个人

知识大全 PHP两种查询函数array / row的区别?

PHP两种查询函数array/row的区别?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!格式my

知识大全 Google PageRank PR值在线查询php代码

GooglePageRankPR值在线查询php代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 php执行数据库查询返回json格式数据

  <?php  //需要执行的SQL语句//单条$sql="selectidnamefromtbl_userwhereid=";//多条数据//$sql="selectidnamefromtb

知识大全 在中国,如何查询本人的档案所在地

在中国,如何查询本人的档案所在地档案扮演着十分重要的角色,很多地方都要用到。通常档案是跟随户口一起的,但很多情况下可以分开,比如外地上学,异地就业等等。很多人毕业后或者跳槽到大城市,档案留在原来上学或