PHP源码-利用 QQWry.Dat 实现 IP 地址高效检索

时间:2010-01-14 09:53:00   来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:兴趣的话,读一读下面的代码应该就能看出来了。代码中加了很详细的注释,应该很容易读懂的。                 在创建这个类的一个实例后,实例中就保存了打开的文件指针和一些查询需要的信息,每次查询时不需要重新打开文件,直到页面执行结束后,打开的文件才会自动关闭。这样。在一个页面内进行多次...
  正文:

根据 LumaQQ 开发者文档中的纯真 IP 数据库格式详解,我编写了一个 PHP 的查询 IP 所在地区信息的类。在编写过程中发现纯真 IP 数据库格式详解中关于记录区的描述不是很全面,不过出入也不是很大,所以我没必要再写一份纯真 IP 数据库的格式说明了,大家感兴趣的话,读一读下面的代码应该就能看出来了。代码中加了很详细的注释,应该很容易读懂的。
  
  
  
  
    在创建这个类的一个实例后,实例中就保存了打开的文件指针和一些查询需要的信息,每次查询时不需要重新打开文件,直到页面执行结束后,打开的文件才会自动关闭。这样。在一个页面内进行多次查询时,效率是很高的。并且此类不仅可以直接查询 IP,还可以自动将域名解析为 IP 进行查询。
  
    下面是程序代码:
  
  
  
  <?php
  /**
  * @author 马秉尧
  */
  
  class IpLocation {
  
  /**
  * QQWry.Dat文件指针
  * @var resource
  */
  
  var $fp;
  
  /**
  * 第一条IP记录的偏移地址
  *
  * @var int
  */
  
  var $firstip;
  
  /**
  * 最后一条IP记录的偏移地址
  *
  * @var int
  */
  
  var $lastip;
  
  /**
  * IP记录的总条数(不包含版本信息记录)
  *
  * @var int
  */
  
  var $totalip;
  
  /**
  * 返回读取的长整型数
  *
  * @Access private
  * @return int
  */
  
  function getlong() {
  
  //将读取的little-endian编码的4个字节转化为长整型数
  
  $result = unpack('Vlong', fread($this->fp, 4));
  
  return $result['long'];
  
  }
  
  /**
  * 返回读取的3个字节的长整型数
  *
  * @access private
  * @return int
  */
  
  function getlong3() {
  
  //将读取的little-endian编码的3个字节转化为长整型数
  
  $result = unpack('Vlong', fread($this->fp, 3).chr(0));
  
  return $result['long'];
  
  }
  
  /**
  * 返回压缩后可进行比较的IP地址
  *
  * @access private
  * @param string $ip
  * @return string
  */
  
  function packip($ip) {
  
  // 将IP地址转化为长整型数,如果在PHP5中,IP地址错误,则返回False,
  
  // 这时intval将Flase转化为整数-1,之后压缩成big-endian编码的字符串
  
  return pack('N', intval(ip2long($ip)));
  
  }
  
  /**
  * 返回读取的字符串
  *
  * @access private
  * @param string $data
  * @return string
  */
  
  function getstring($data = "") {
  
  $char = fread($this->fp, 1);
  
  while (ord($char) > 0) { // 字符串按照C格式保存,以结束
  
  $data .= $char; // 将读取的字符连接到给定字符串之后
来源:http://www.002pc.com/master/College/Programming/PHP/11826.html

 1/4    1 2 3 4 下一页 尾页
收藏到:

关于《PHP源码-利用 QQWry.Dat 实现 IP 地址高效检索》文章的评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面

随机文章

    SQL Error: select * from ***_ecms_article where classid='86' and checked=1 order by rand() limit 10

顶出来的热门

    SQL Error: select * from ***_ecms_article where classid='86' and checked=1 order by diggtop desc,id desc limit 10
站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td