[保留] [源码] 纯php实现ip或ip段转换地名或其它解释

[功能]

[color=Red]2008/04/09 更新程序,修正 MIC_make_data.php 的一处小错误[/color]
在线演示: http://www.hightman.cn/demo/MyIpConv/demo.php
下载: 参见附件 (不含文本数据, 太大了,麻烦, 从纯真中转或自己建立)

用于将IP地址范围转换成描述字符串,常用于IP位置查询,城市查询,ISP查询等。
纯 php 代码完成,不依赖任何扩展,采用二分查找定位IP区间,速度很快。
文本词典可兼容纯真IP数据库,提供程序脚本转换文本文件至本程序使用的数据。
经比较本词典最终生成的二进制文件比纯真结构还略小。
现在网上流行的基本上是采用纯真数据库,但该库自己修改不太方便,也不利于修
改成其它查询。

[说明]
./example.php             - 查询测试
./MIC_make_data.php       - 文本词典转换脚本
                            php MIC_make_data.php <文本文件> <输 出的库文件>
./MIC_query.inc.php       - 查询主类
                            有: open($fpath), query($ip), version(void), close() 
                            这几个方法
./mic.dat                 - 转换纯真IP库
./mic.txt                 - 纯真IP数据库

[txt词典说明]
// mic.txt 的格式为一行一条记录, 每条记录由 4 个字段组成, 字段之间用空格
// 或者制表符分开, 空格个数无所谓, 纯真 IP 的导出数据可直接使用, 只有最后
// 一个字段内部可以包含空格, 前三个字段不允许出现空格.
//
// 注: 对 mic.txt 无特别要求, 不需要事先排序, 也不需要范围调整, 转换程序会
//     自动进行修正, 以方便大家自行添加记录.  
//
//     当起起始 IP 使用 CIDR 计算方式时, 则省略 结束IP
//
// <起始IP> <结束IP> <解释1(通常为国别/省市)>  <解释2(具体其它说明,可 以为空)>
// 
// 如:
//
// 218.10.6.45     218.10.6.57     黑龙江省齐齐哈尔市 网通
// 218.10.6.58     218.10.6.58     黑龙江省齐齐哈尔市 梅里斯区雅尔塞镇欣欣网吧
// 218.10.6.75     218.10.6.75     黑龙江省齐齐哈尔市拜泉县 超人网吧
// 218.10.6.59     218.10.6.74     黑龙江省齐齐哈尔市 网通
//
// 210.32.0.0/16                   浙江省杭州市  浙江大学
// 

[dat数据结构]
文本数据较为简单,文中所有的整型数据均以 Little endian 方式存储。解释如下:
1. 前4字节固定为:CTIP
2. 第 4 ~ 8 字节:索引记录的条数
3. 紧接着是索引记录,每一条索引为 12 字节,三个整数。
   分别为:起始IP地址,解释1的相对偏移,解释2的相对偏移。
4. 索引数据根据起始IP线性排列
5. 索引数据之后另外还有 12 字节的数据,依次为最后一条索引记录的 
   [终止IP] [解释1的数据总长] [词典生成时间戳]
6. 再紧接着就是解释1的数据,每条解释的数据第一字节的ASCII值代表数据的长度,
   然后紧接着就是解释数据字符串。
   (这样做的目的是为了重用这些解释字符串)
   解释1的绝对偏移 = (索引记录条数) * 12 + 20 + 解释1的相对偏移
7. 解释2的数据存取类似解释1
   解释2的绝对偏移 = (索引记录条数) * 12 + 20 + 解释1的总长度 + 解释2的相对偏移

[其它应用]
除可以查询IP所在地外,可以通过自己制作文本数据库再加以转换以便判断用户的来源ISP
(典型如网通、电信、教育网、海外)然后自动跳转到相应的域名或IP,以求得最好的用户
访问速度。

--
后语:希望大家共享自己的相关IP数据数据

你可能感兴趣的:([保留] [源码] 纯php实现ip或ip段转换地名或其它解释)