您现在的位置: 无忧电子商务网 >> 信息学院 >> 程序开发 >> php >> 正文

利用QQWry.Dat实现IP地址高效检索

作者:佚名    信息学院来源:整理    点击数:    更新时间:2008-2-2 我要参与讨论

  根据 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

[1] [2] [3] [4] 下一页

在google里搜索更多利用QQWry.Dat实现IP地址高效检索

Google
Web www.51ec.org
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
我来说两句 对此文章发表了评论
  昵 称: *必填    ·注册用户·
  评 分: 1分 2分 3分 4分 5分     严禁发表危害国家安全、政治、黄色淫秽等内容的评论,用户需对自己在使用本网站服务过程中的行为承担法律责任。本站管理员有权保留或删除评论内容,评论内容只代表机友个人观点,与本网站立场无关。  
评 论
内 容

 
评论列表 (最新 评论仅限网友观点!)

供求信息




| 设为首页 | 加入收藏 | 关于我们 | 广告服务 | 联系方式 | 友情链接 | 版权申明