php 读取纯真书库,PHP读取纯真IP数据库的函数
PHP读取纯真IP数据库的函数,以下代码提取自Discuz! X2
$tinyipfile Discuz! 独有高压缩比算法和快速检索的IP数据库路径
下载地址:http://www.discuz.net/thread-1873888-1-1.html
$fullipfile 纯真数据库路径
下载地址:http://update.cz88.net/soft/qqwry.rar
代码:
function convertip($ip) {
$return = '';
if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
$iparray = explode('.', $ip);
if($iparray[0] == 10 || $iparray[0] == 127 || ($iparray[0] == 192 && $iparray[1] == 168) || ($iparray[0] == 172 && ($iparray[1] >= 16 && $iparray[1] <= 31))) {
$return = '- LAN';
} elseif($iparray[0] > 255 || $iparray[1] > 255 || $iparray[2] > 255 || $iparray[3] > 255) {
$return = '- Invalid IP Address';
} else {
$tinyipfile = DISCUZ_ROOT.'./data/ipdata/tinyipdata.dat';
$fullipfile = DISCUZ_ROOT.'./data/ipdata/wry.dat';
if(@file_exists($tinyipfile)) {
$return = convertip_tiny($ip, $tinyipfile);
} elseif(@file_exists($fullipfile)) {
$return = convertip_full($ip, $fullipfile);
}
}
}
return $return;
}
function convertip_tiny($ip, $ipdatafile) {
static $fp = NULL, $offset = array(), $index = NULL;
$ipdot = explode('.', $ip);
$ip = pack('N', ip2long($ip));
$ipdot[0] = (int)$ipdot[0];
$ipdot[1] = (int)$ipdot[1];
if($fp === NULL && $fp = @fopen($ipdatafile, 'rb')) {
$offset = @unpack('Nlen', @fread($fp, 4));
$index = @fread($fp, $offset['len'] - 4);
} elseif($fp == FALSE) {
return '- Invalid IP data file';
}
$length = $offset['len'] - 1028;
$start = @unpack('Vlen', $index[$ipdot[0] * 4] . $index[$ipdot[0] * 4 + 1] . $index[$ipdot[0] * 4 + 2] . $index[$ipdot[0] * 4 + 3]);
for ($start = $start['len'] * 8 + 1024; $start < $length; $start += 8) {
if ($index{$start} . $index{$start + 1} . $index{$start + 2} . $index{$start + 3} >= $ip) {
$index_offset = @unpack('Vlen', $index{$start + 4} . $index{$start + 5} . $index{$start + 6} . "\x0");
$index_length = @unpack('Clen', $index{$start + 7});
break;
}
}
@fseek($fp, $offset['len'] + $index_offset['len'] - 1024);
if($index_length['len']) {
return '- '.@fread($fp, $index_length['len']);
} else {
return '- Unknown';
}
}
function convertip_full($ip, $ipdatafile) {
if(!$fd = @fopen($ipdatafile, 'rb')) {
return '- Invalid IP data file';
}
$ip = explode('.', $ip);
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
if(!($DataBegin = fread($fd, 4)) || !($DataEnd = fread($fd, 4)) ) return;
@$ipbegin = implode('', unpack('L', $DataBegin));
if($ipbegin < 0) $ipbegin += pow(2, 32);
@$ipend = implode('', unpack('L', $DataEnd));
if($ipend < 0) $ipend += pow(2, 32);
$ipAllNum = ($ipend - $ipbegin) / 7 + 1;
$BeginNum = $ip2num = $ip1num = 0;
$ipAddr1 = $ipAddr2 = '';
$EndNum = $ipAllNum;
while($ip1num > $ipNum || $ip2num < $ipNum) {
$Middle= intval(($EndNum + $BeginNum) / 2);
fseek($fd, $ipbegin + 7 * $Middle);
$ipData1 = fread($fd, 4);
if(strlen($ipData1) < 4) {
fclose($fd);
return '- System Error';
}
$ip1num = implode('', unpack('L', $ipData1));
if($ip1num < 0) $ip1num += pow(2, 32);
if($ip1num > $ipNum) {
$EndNum = $Middle;
continue;
}
$DataSeek = fread($fd, 3);
if(strlen($DataSeek) < 3) {
fclose($fd);
return '- System Error';
}
$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
fseek($fd, $DataSeek);
$ipData2 = fread($fd, 4);
if(strlen($ipData2) < 4) {
fclose($fd);
return '- System Error';
}
$ip2num = implode('', unpack('L', $ipData2));
if($ip2num < 0) $ip2num += pow(2, 32);
if($ip2num < $ipNum) {
if($Middle == $BeginNum) {
fclose($fd);
return '- Unknown';
}
$BeginNum = $Middle;
}
}
$ipFlag = fread($fd, 1);
if($ipFlag == chr(1)) {
$ipSeek = fread($fd, 3);
if(strlen($ipSeek) < 3) {
fclose($fd);
return '- System Error';
}
$ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
fseek($fd, $ipSeek);
$ipFlag = fread($fd, 1);
}
if($ipFlag == chr(2)) {
$AddrSeek = fread($fd, 3);
if(strlen($AddrSeek) < 3) {
fclose($fd);
return '- System Error';
}
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return '- System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0))
$ipAddr2 .= $char;
$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
fseek($fd, $AddrSeek);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
} else {
fseek($fd, -1, SEEK_CUR);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return '- System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0))
$ipAddr2 .= $char;
}
fclose($fd);
if(preg_match('/http/i', $ipAddr2)) {
$ipAddr2 = '';
}
$ipaddr = "$ipAddr1 $ipAddr2";
$ipaddr = preg_replace('/CZ88\.NET/is', '', $ipaddr);
$ipaddr = preg_replace('/^\s*/is', '', $ipaddr);
$ipaddr = preg_replace('/\s*$/is', '', $ipaddr);
if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
$ipaddr = '- Unknown';
}
return '- '.$ipaddr;
}
php 读取纯真书库,PHP读取纯真IP数据库的函数相关推荐
- php获取ip 然后返回地址,PHP调用纯真IP数据库返回具体地址的方法
我们在日常开发中友很多场景需要显示具体的IP地址,如果调用本地的IP的地址库,这就需要考虑IP地址库数据量的问题,所以我们一般会采用在线的IP地址查询,今天就把PHP如何调用本地的纯真IP地址数据的教 ...
- 读取纯真IP数据库的公用组件QQWry.NET
这是一个读取纯真IP数据库的公用组件接口,我是通过luma的<纯真IP数据库格式详解>了解了纯真IP数据库数据格式,并且基于网络上的一个IPLocation.dll源码的基础改编而来.我为 ...
- java读取纯真IP数据库qqwry.dat的源代码
java读取纯真IP数据库QQwry.dat的源代码,要运行此程序必须有 到网上下载QQwry.dat,下载地址 http://www.cz88.net/down/ 由于太大,我这里就不提供了. ...
- mysql 纯真ip 导出dat_C# 读取纯真IP数据库QQWry.dat获取地区信息
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace 纯真IP数据 ...
- Python3访问纯真IP数据库的代码
工作中我们常需要使用纯真IP数据库内的数据做分析,如何使用Python3访问读取纯真IP数据库的方法有很多朋友需要.今天在网上找了一个,分享一下.虽然不知道该代码的作者是谁,顺便感谢一下~~~ #! ...
- 纯真IP数据库格式详解
摘要 网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础.不过关于其格式的文档却非常之少,后来终于在网上 找到了一份文档,得以了解其内幕,不过那份文档寥寥 ...
- 纯真IP数据库格式详解zt
摘要 网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础.不过关于其格式的文档却非常之少,后来终于在网上找到了一份文档,得以了解其内幕,不过那份文档寥寥数 ...
- [转]纯真IP数据库格式详解
纯真IP数据库格式详解 摘要 网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础.不过关于其格式的文档却非常之少,后来终于在网上找到了一份文档,得以了解其 ...
- 为PHP增加纯真IP数据库(qqwry)支持https://blog.jiqila.com/post/229/
当我们的网站需要根据IP来查询IP来源时,我们需要一个IP数据库,而国内最好的IP数据库当属"纯真IP数据库"了.为了读取"纯真IP数据库"中的数据,一般情况下 ...
最新文章
- linux下前一天时间格式
- 《应届生求职面试全攻略》学习笔记(三)——面试题目分类讲解
- jira在linux下面的安装和配置
- vue3.x通过ref属性获取元素
- Azure开发者任务之一:解决Azure Storage Emulator初始化失败
- 哈希集合——hashSet
- TYVJ1613 不和谐的公司
- Topcoder SRM 144 DIV 1
- hermite插值c语言程序,张艳-埃尔米特Hermite 插值逼近的C语言程序.doc
- 贴片二极管正负极如何区分
- vue 开发app处理手机返回键问题
- dos攻击防范 java_php DOS攻击实现代码(附如何防范)
- 【STM32】STM32控制继电器实现电动推杆的伸缩
- oracle 用户权限设置,oracle用户权限管理使用详解
- 天津春季高考历年计算机考试卷,最新春季高考历年真题-天津市春季高考语文试卷...
- 融360|简普科技《维度》报告:超过三成受访者遇过理财投资陷阱 90后受害最深
- 02-PDI(Kettle)导入与导出
- 不会编程如何制作Android辅助功能?
- mkdir,rmdir详解
- window 使用rabbitMQ 报错Applying plugin configuration to rabbit@... failed.