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

article/2025/11/9 8:22:14

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!!!

云盘下载


http://chatgpt.dhexx.cn/article/SIspG2yd.shtml

相关文章

百度查到的ip和ipconfig查到的不一样,公网ip 私网ip

公网IP是在公网中使用的IP地址&#xff0c;一个可直接访问其他IP&#xff0c;也可被其他IP直接访问的一个独立身份。有了它&#xff0c;你可以直接找到互联网中的其他电脑&#xff0c;也可以被其他电脑找到私网IP是在局域网中使用的IP地址。 而私网IP处于局域网下&#xff0c;它…

私网ip和公网ip_详解

备注:此博客为转载,原作者地址请点击此处 版权声明&#xff1a;本文为小小呆原创文章&#xff0c;转载请注明出处&#xff01; https://blog.csdn.net/gui951753/article/details/79210535 IP可以分为Public IP 和 Private IP,出现这种规划的原因在于IPv4所能表示的IP太少而电脑…

没有公网IP,如何实现数据共享?

数据共享就是让在不同地方使用不同计算机、不同软件的用户能够读取他人数据并进行各种操作、运算和分析。不同层次、不同部门信息系统间&#xff0c;信息和信息产品的交流与共用&#xff0c;就是把信息这一种在互联网时代中重要性越趋明显的资源与其他人共同分享。 数据共享有…

【网络】为什么百度查到的ip和ipconfig查到的不一样;详解公网Ip和私网ip;详解网络分类ABC;

原文地址 IP可以分为Public IP 和 Private IP,出现这种规划的原因在于IPv4所能表示的IP太少而电脑太多以至于不够用&#xff0c;然而只有Public IP才能直接连接上网络&#xff0c;所以对于那些公司&#xff0c;学校&#xff0c;政府机构等场所&#xff0c;就可以集中使用私有的…

【优化组合】基于matlab多种群混沌蚁群算法求解机组组合优化问题【含Matlab源码 2017期】

⛄一、多种群混沌蚁群算法求解机组组合优化问题 0 引言 机组组合问题(Unit Commitment,UC)又称开停机计划,是电力系统解决优化潮流(OPF)、经济调度(ED)进而实现自动发电控制(AGC)、自动电压控制(AVC)的前提。机组组合问题具有高维数、非凸、离散、非线性的特点,在数学上为NP-H…

组合优化基础

组合优化问题&#xff08;一&#xff09;TOC p问题&#xff0c;NP问题&#xff0c;NP完全问题&#xff0c;NP难问题 时间复杂度并不是表示一个程序解决问题需要画多少时间&#xff0c;而是当程序所处理的问题规模扩大后&#xff0c;程序需要的时间对应增长的有多快。 时间复…

组合优化中的全排列生成方法

组合优化中的全排列生成 之前有同学遇到组合优化&#xff08;如0-1优化&#xff09;问题&#xff0c;想采用穷举法&#xff0c;那么首先就要穷举产生所有的组合。 以0-1优化为例&#xff0c;假设当前有3个item&#xff0c;每个item有“选”或“不选”两种状态&#xff0c;那么…

机器学习求解组合优化问题强化学习笔记

目录 机器学习求解组合优化问题 求解组合优化问题的传统方法 精确算法&#xff1a; 启发式算法&#xff1a; 机器学习的相关知识 注意力机制 深度强化学习 主线奖励和稀疏奖励问题&#xff1a; 稀疏奖励问题&#xff1a; 辅助奖励函数设计 On-Policy 和Off-Policy问…

最新综述:用于组合优化的强化学习

©PaperWeekly 原创 作者 | 王馨月 学校 | 四川大学本科生 研究方向 | 自然语言处理 摘要 推许多解决组合优化问题的传统算法都涉及使用手工构造的启发式算法&#xff0c;这些启发式算法能够依次地构造解决方案。这种启发式方法是由领域专家设计的&#xff0c;且一般由于问…

【深度学习+组合优化】深度学习和强化学习在组合优化方面有哪些应用?

运筹优化博士&#xff0c;只做原创博文。更多关于运筹学&#xff0c;优化理论&#xff0c;数据科学领域的内容&#xff0c;欢迎关注我的知乎账号&#xff1a;https://www.zhihu.com/people/wen-yu-zhi-37 0 简介 2017年阿里巴巴的一篇用深度强化学习求解3维装箱问题的论文引发…

使用GNN求解组合优化问题

文章目录 1 论文内容1.1 先验知识1.2 论文方法1.2.1 大致原理1.2.2 源码关键实现 1.3 实际问题上的应用1.3.1 风险分散1.3.2 Interval Scheduling&#xff08;不大懂译&#xff0c;区间调度&#xff1f;&#xff09;1.3.3 配水管网的传感器布置 2 论文求解器源码的使用2.1 安装…

遗传算法的应用之函数优化和组合优化

目录 函数优化函数最值函数最值多个局部最优解问题 组合优化旅行商问题背包问题二进制表达法顺序表达式变长表达法适值函数的设计 转载原创 函数优化 函数最值 函数最值 该例子参考 深入浅出遗传算法&#xff0c;透析GA本质.&#xff08;强烈安利&#xff09;中的例子&…

单目标优化,多目标优化,数值优化,组合优化

何为优化&#xff1f; 措施&#xff1a; 对应方法 变得更优&#xff1a; 对应的结果更加的好 优化&#xff1a; 动词&#xff0c;一种行为方法----------->目的是获得更好的结果&#xff0c;总之有所改善 优化问题的三要素&#xff1a; &#xff08;1) 决策变量 …

OM | 强化学习 + 约束规划求解组合优化问题

组合优化在航空航天、交通规划以及经济学等众多学科领域中有广泛应用&#xff0c;其目标是在有限集中寻找最优解。然而状态空间过大的问题让目前组合优化变得棘手。在过去的几年中&#xff0c;使用深度强化学习&#xff08;deep reinforcement learning&#xff0c;DRL&#xf…

连续优化、离散优化、组合优化、整数优化和凸优化

optimization分类 4 Classification of optimization problem (IP: integer programming, MINLP: mixed integer non-linear programming, MILP: mixed integer linear programming, LP: linear programming, QP: quadratic programming, NLP: non-linear programming) 出自 其…

优化|深度学习或强化学习在组合优化方面有哪些应用?

来源&#xff1a;图灵人工智能 前 言 深度强化学习求解组合优化问题近年来受到广泛关注&#xff0c;是由于其结合了强化学习(Reinforcement learning)强大的决策(decision-making)能力和深度学习(deep learning)的各种模型(RNN、Transformer、GNN等等)强大的信息提取表征能力…

组合最优化

组合最优化(参考资料) 最优化问题 ​ 最优化问题涉及的应用领域很广&#xff0c;问题的种类与性质繁多&#xff0c;归纳起来&#xff0c;可分为函数优化问题和组合优化问题两大类。其中函数最优化问题的解是一定区域内连续取值的量&#xff0c;而组合优化问题的解则是离散取值…

进化算法——组合优化

离散优化问题&#xff0c;也被称为组合优化问题&#xff0c;我们可以视之为在候选目标的有限集中找出最优目标 被称为搜索空间的基数。在理论上我们可以通过评价这个解的每一个f(x)来求解上式&#xff0c;这种组合优化的方法被称为穷举搜索或蛮力。 目录 旅行商问题TSP 旅行商…

组合优化求解方法

1. 离散优化/整数规划 整数规划&#xff0c;或者离散优化&#xff08;Discrete Optimization&#xff09;&#xff0c;是指数学规划问题中自变量存在整数。 混合整数规划&#xff08;Mixed Integer Programming, MIP&#xff09;&#xff0c;即自变量既包含整数也有连续变量 …

【容器~原始真解】Docker —— 容器的使用

&#x1f50e;这里是【秒懂云原生】&#xff0c;关注我学习云原生不迷路 &#x1f44d;如果对你有帮助&#xff0c;给博主一个免费的点赞以示鼓励 欢迎各位&#x1f50e;点赞&#x1f44d;评论收藏⭐️ &#x1f440;专栏介绍 【秒懂云原生】 目前主要更新微服务和容器&#…