php基于纯真IP数据库实现IP地址信息查询

最近在学习php,记录下这个php基于纯真IP数据库实现IP地址信息查询的实现方法。

注意:这个模块纯真ip数据库需要离线下载,不然的话访问会出错!!!文章结尾会附上最新的纯真ip数据库。

部分参考博主——孟坤博客

这里还增加了访客浏览器,系统,自动获取访客ip功能的实现!!

后续更新:增加了显示时间,天气,温度,以及历史上的今天功能!!

#显示效果

#也可以通过访问查看效果——传送门

#首先先新建一个IPQuery.class.php文件

<?php
header("Conten-type:text/html;charset=utf-8");
class IPQuery{
private $fh; //ip数据库文件句柄
private $first;//第一条索引
private $last;//最后一台哦索引
private $total;//总索引
private $dbfile = __DIR__ . DIRECTORY_SEPARATOR . 'qqwry.dat'; //数据库文件存放位置 其中_DIR_表示当前脚本路径,DIRECTORY_SEPARATOR在php中统一为反斜杠\
private $dbExpires=86400*10; //数据库文件有效期10天,如果无需自动更新,则设置为0
//构造函数
function _construct(){
//ip 数据库文件不存在或者过期,则自动获取
if(!file_exists($this->dbfile)||($this->dbExpires&&((time()-filetime($this->dbfile))>$this->dbExpires))){
$this->update();
}
}
//忽略超时
private function ignore_timeout(){
@ignore_user_abort(true);//设置客户端断开连接时是否中断脚本的执行
@ini_set('max_execution_time',48*60*60);//为一个配置选项设置值
@set_time_limit(48*60*60);//设置脚本最大执行时间 这里设置了两天
@ini_set('memory_limit','4000M');//4G
}
//读取小端little-endian编码的4个字节转化为长整型数
private function getLong4(){
$result=unpack('Vlong',fread($this->fh,4));
return $result['long'];
}
//读取小断little-endian编码的3个字节转化为长整型数
private function getLong3(){
$result=unpack('Vlong',fread($this->fh,3).chr(0));
return $result['long'];
}
//查询位置信息
private function getPos($data=''){
$char=fread($this->fh,1);
while(ord($char)!=0){//ord()返回字符串的第一个字符的ascii码值
//地区信息以0结束
$data.=$char;
$char=fread($this->fh,1);
}
return $data;
}
//查询运营商
private function getISP(){
$byte=fread($this->fh,1);//标记字节
switch(ord($byte)){
case 0:$area='';break;//为0时结束,没有信息
case 1://被重定向
fseek($this->fh,$this->getLong3());//在文件指针中定位
$area=$this->getPos();break;
case 2://被重定向
fseek($this->fh,$this->getLong3());//在文件指针中定位
$area=$this->getPos();break;
default:$area=$this->getPos($byte);break;//没有被重定向
}
return $area;
}
//检查ip格式是否正确
public function checkIp($ip){
$arr=explode('.',$ip);//使用.来分割ip
if(count($arr)!=4)return false;
for($i=0;$i<4;$i++){
if($arr[$i]<'0'||$arr[0]>'255'){
return false;
}
}
return true;
}
//查询ip
public function query($ip){
if(!$this->checkIp($ip)){
return false;
}
$this->fh=fopen($this->dbfile,'rb');
$this->first=$this->getLong4();
$this->last=$this->getLong4();
$this->total=($this->last-$this->first)/7;//每条索引占7个字节
$ip=pack('N',intval(ip2long($ip)));//intval获取变量的整数值,ip2long将一个IPV4的字符串互联网协议转换成数字格式
//二分查找ip位置
$l=0;
$r=$this->total;
while($l<$r){
$m=floor(($l+$r)/2);
fseek($this->fh,$this->first+$m*7);
$beginip=strrev(fread($this->fh,4));//中间索引的开始ip地址,strrev进行反转字符串
fseek($this->fh,$this->getLong3());
$endip=strrev(fread($this->fh,4));//中间索引的结束ip地址
if($ip<$beginip){
//用户的ip小于中间索引的结束ip地址时,右边应该更新为左边-1
$r=$m-1;
}
else{
if($ip>$endip)
{
//用户ip大于中间索引的结束ip地址时,更新后的索引位置应为m+1
$l=$m+1;
}
else
{
//用户ip在中间索引的ip范围内
$findip=$this->first+$m*7;
break;
}
}
}
//查找ip地址段
fseek($this->fh,$findip);
$location['beginip']=long2ip($this->getLong4());//用户ip所在范围的开始地址
$offset=$this->getLong3();
fseek($this->fh,$offset);
$location['endip']=long2ip($this->getLong4());//用户ip所在范围的结束位置
//查找ip信息
$byte=fread($this->fh,1);//标志字节
switch(ord($byte)){
case 1://都被重定向
$countryOffset=$this->getLong3();//重定向地址
fseek($this->fh,$countryOffset);
$byte=fread($this->fh,1);//标志字节
switch(ord($byte)){
case 2://信息被二次重定向
fseek($this->fh,$this->getLong3());
$location['pos']=$this->getPos();
fseek($this->fh,$countryOffset+4);
$location['isp']=$this->getISP();
break;
default://信息没有被二次重定向
$location['pos']=$this->getPos($byte);
$location['isp']=$this->getISP();
break;
}
break;
case 2://信息被重定向
fseek($this->fh,$this->getLong3());
$location['pos']=$this->getPos();
fseek($this->fh,$offset+8);
$location['isp']=$this->getISP();
break;
default://信息没有被重定向
$location['pos']=$this->getPos($byte);
$location['isp']=$this->getISP();
break;
}
//信息转码处理
foreach($location as $k=>$v){
$location[$k]=iconv('gb2312','utf-8',$v);//字符串按要求的字符编码来转换,这里转化为utf-8编码
$location[$k] = preg_replace(array('/^.*CZ88\.NET.*$/isU', '/^.*纯真.*$/isU', '/^.*日IP数据/'), '', $location[$k]);//利用正则搜索替换
$location[$k]=htmlspecialchars($location[$k]);//吧预定义的字符"<"和">"转化为html实体
}
return $location;
}
//更新数据库
public function update(){
$this->ignore_timeout();
$copywrite=file_get_contents('http://update.cz88.net/ip/copywrite.rar');//将这个文件读作字符串
$qqwry=file_get_contents('http://update.cz88.net/ip/qqwry.rar');
$key=unpack('V6',$copywrite)[6];
for($i=0;$i<0x200;$i++){//512
$key*=0x805;//
$key++;
$key=$key&0xFF;
$qqwry[$i]=chr(ord($qqwry[$i])^$key);
}
$qqwry=gzuncompress($qqwry);//实现字符串压缩
file_put_contents($this->dbfile,$qqwry);
}
//析构函数
function _destruct(){
if($this->fh){
fclose($this->fh);
}
$this->fp=null;
}
}
?>

#在index.php中进行调用

<?php
header("Conten-type:text/html;charset=utf-8");
require_once('IPQuery.class.php');
$ip=new IPQuery();
function getIP(){
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
$ip = getenv("HTTP_CLIENT_IP");
} else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
} else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
$ip = getenv("REMOTE_ADDR");
} else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
$ip = "unknown";
}
return ($ip);
}
function GetOs() {
if (!empty($_SERVER['HTTP_USER_AGENT'])) {
$OS = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/win/i', $OS)) {
$OS = 'Windows';
} elseif (preg_match('/mac/i', $OS)) {
$OS = 'MAC';
} elseif (preg_match('/linux/i', $OS)) {
$OS = 'Linux';
} elseif (preg_match('/unix/i', $OS)) {
$OS = 'Unix';
} elseif (preg_match('/bsd/i', $OS)) {
$OS = 'BSD';
} else {
$OS = 'Other';
}
return $OS;
} else {
return "获取访客操作系统信息失败!";
}
}
function GetBrowser() {
if (!empty($_SERVER['HTTP_USER_AGENT'])) {
$br = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/MSIE/i', $br)) {
$br = 'MSIE';
} elseif (preg_match('/Firefox/i', $br)) {
$br = 'Firefox';
} elseif (preg_match('/Chrome/i', $br)) {
$br = 'Chrome';
} elseif (preg_match('/Safari/i', $br)) {
$br = 'Safari';
} elseif (preg_match('/Opera/i', $br)) {
$br = 'Opera';
} else {
$br = 'Other';
}
return $br;
} else {
return "获取浏览器信息失败!";
}
}
$checkip=getIP();
$fkos=GetOs();
$fkgetbrowser=GetBrowser();
$addr=$ip->query($checkip);
echo "<pre>
IP起始段:{$addr['beginip']}
IP结束段:{$addr['endip']}
实际地址:{$addr['pos']}
运营商:{$addr['isp']}
操作系统:{$fkos}
浏览器:{$fkgetbrowser}
</pre>
";
?>

#离线纯真ip数据库下载,文件名为qqwry.dat!!!

云盘下载

php基于纯真IP数据库实现IP地址信息查询相关推荐

  1. 基于纯真本地数据库的 IP 地址查询 PHP 源码

    <?php /*** 纯真 IP 数据库查询 * * 参考资料:* - 纯真 IP 数据库 http://www.cz88.net/ip/* - PHP 读取纯真IP地址数据库 http://j ...

  2. IP.SB - 在线 IPv4 / IPv6 信息查询

    IP.SB - 在线 IPv4 / IPv6 信息查询 1.IP.SB 的由来 IP.SB 前身是 IP.GS ,一个专门用于查询本地出口 IP 的网站,初衷是为了让用户更方便地知道自己的本地出口 I ...

  3. 大文件表空间+创建大文件表空间+查询数据库表空间类型信息+查询数据库表空间类型信息...

    1用于解决存储文件大小不够的问题 2与普通表空间不同的地方在于大文件表空间只对应唯一一个数据文件或临时文件,普通表空间可最多1022个数据文件或临时文件 3大文件表空间对应文件可达4G个数据块大小,普 ...

  4. 中间件——利用Axis 2 进行Web service开发(中英文双向翻译,中国邮政编码--地址信息查询)

    问题描述: 1.利用Java Swing 或SWT 开发一桌面应用程序 2.应用程序中集成以下网站提供的的Web服务:http://www.webxml.com.cn/zh_cn/web_servic ...

  5. php获取ip 然后返回地址,PHP调用纯真IP数据库返回具体地址的方法

    我们在日常开发中友很多场景需要显示具体的IP地址,如果调用本地的IP的地址库,这就需要考虑IP地址库数据量的问题,所以我们一般会采用在线的IP地址查询,今天就把PHP如何调用本地的纯真IP地址数据的教 ...

  6. PHP调用纯真IP数据库返回具体地址

    本文主要是说PHP如何使用纯真IP数据库 我提供一个方法给大家 function convertip($ip) { $ip1num = 0;$ip2num = 0;$ipAddr1 ="&q ...

  7. 最新IP地址数据库 全球IP数据库 国内IP数据库 国外IP数据库 CIDR掩码 2018年1月版...

    最新IP地址数据库(qqzeng-ip) 2018年 1月 最新发行版 351756条数据 基于:国内基于省市区以及运营商 国外基于国家 版本: 全球旗舰版  国内精华版 国外拓展版英文版 掩码版 字 ...

  8. 最新IP数据库 全球IP数据库 IP城市数据库 2019年6月版

    最新IP地址数据库(qqzeng-ip) 2019年 6月 最新发行版 534836条数据 基于:国内基于省市区以及运营商 国外基于国家 版本: 全球旗舰版  国内精华版 国外拓展版英文版 掩码版 字 ...

  9. 最新IP数据库 全球IP数据库 国内IP数据库 国外IP数据库 CIDR路由掩码 2018年12月版...

    最新IP地址数据库(qqzeng-ip) 2018年 12月 最新发行版 415692条数据 基于:国内基于省市区以及运营商 国外基于国家 版本: 全球旗舰版  国内精华版 国外拓展版英文版 掩码版 ...

  10. ip地址信息查询入口,附key

    分享一个查询ip地址信息的接口 http://apis.haoservice.com/lifeservice/queryIpAddr?ip=60.12.8.29&key=047c10b650e ...

最新文章

  1. wxWidgets:添加状态栏
  2. stm32f4 输出pwm波_stm32的pwm输出代码及注释
  3. Ext.form.field.CheckBox复选框和Ext.form.field.Radio单选框
  4. 视+AR正式发布EasyAR引擎2.0版,并宣布开放AR相机平台
  5. NSCharacterSet
  6. Truthman or Fakeman 并查集
  7. win—命令行窗口一层一层的打开文件
  8. Centos 7 一键安装openstack
  9. 判定是否支持XHTML
  10. 在vc中实现获取汉字拼音的首字母
  11. pandas空值填充
  12. Eclipse 英文翻译一点点
  13. ros源码下载及编译
  14. 51单片机LED流水灯、走马灯的实现
  15. 斐波拉契数列前n项和 斐波拉契数列第n项
  16. 使用Java实现Comet风格的Web应用(二)
  17. 启示录java游戏_龙之幻想启示录(正版)
  18. 克鲁斯卡尔算法与普里姆算法详解
  19. 超好用的ACM刷题网站,你用过几个?
  20. python卖水果_小姨开水果店的,所以今天用Python写了一个水果店小系统!

热门文章

  1. 操作系统学习-知识点总结(持续更新)
  2. 海康威视摄像头网线连接笔记本电脑,客户端提示:1连接设备失败。设备不在线或网络原因引起的连接超时等。(HCNetSDK.dll[7].)解决方案
  3. c语言头文件及形式,C语言头文件作用及写法
  4. 尚硅谷 模拟w3school首页导航条练习
  5. 联想服务器一直在初始化系统,为什么联想“一键恢复”一直在初始化
  6. 李健清华计算机专业,计算机DeepWeb数据库的分类研究李健
  7. 3ds max批量修改贴图名称脚本(最新版本)
  8. ButterWorthFIlter(巴特沃斯滤波器)
  9. linux下载m3u8工具,m3u8命令行下载工具
  10. RadomStuDemo