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

[功能]
2008.04.09 更新,修正MIC_make_data.php 里的一处小错误

在线演示: http://www.hightman.cn/demo/MyIpConv/demo.php
下载: 参见附件 (不含文本数据, 太大了,麻烦, 从纯真中转或自己建立)
http://www.hightman.cn/down/MyIpConv_101122.tgz (最新版本,无 MIC_make_data.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段转换地名或其它解释》上有14条评论

  1. 冷静

    和演不一样啊

    演示的三种方案

    IP 地址: 222.74.195.35的查询结果:
    纯真库:内蒙古锡林浩特市 时尚网吧
    地区库:内蒙古/锡林郭勒/锡林浩特
    珊瑚库:内蒙古 电信

    回复
  2. test218

    下载: 参见附件 (不含文本数据, 太大了,麻烦, 从纯真中转或自己建立)

    怎么”从纯真中转或自己建立”呢??我是一个新手,请教一下.

    回复
  3. 不仅为了聊

    [quote=’冬天来了’ pid=’2980′ dateline=’1235744792′]
    2楼的应该是纯真库吧?哪里有地区库下呢?
    [/quote]

    我也要地区库!!而且,只要国内的就可以了,请作者帮忙!!!

    准备用这个做一个类似于58的跳转效果
    [size=large][/size]

    回复
  4. XuT

    感谢楼主无私分享!
    在pc_webserver2008环境下调试了一下,发现如下问题:
    MIC_query.inc.php中,类MIC_query的open函数告警,将该函数最后的return true;改为return $this;解决,不知是否赞同。
    初接触php(这是我调试的第一个php程序:)),估计是不同php版本的问题。

    另,在zend6开发环境中,提示该类的属性声明var由public、private等代替。计划将该类改为php5。

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注