php跳转分站,PHP判断IP并转跳到相应城市分站的方法

本文实例讲述了PHP判断IP并转跳到相应城市分站的方法。分享给大家供大家参考。具体实现方法如下:

class QQWry{

var $StartIP=0;

var $EndIP=0;

var $Country='';

var $Local='';

var $CountryFlag=0;

// 标识 Country位置

// 0x01,随后3字节为Country偏移,没有Local

// 0x02,随后3字节为Country偏移,接着是Local

// 其他,Country,Local,Local有类似的压缩。可能多重引用。

var $fp;

var $FirstStartIp=0;

var $LastStartIp=0;

var $EndIpOff=0 ;

function getStartIp($RecNo){

$offset=$this->FirstStartIp+$RecNo * 7 ;

@fseek($this->fp,$offset,SEEK_SET) ;

$buf=fread($this->fp ,7) ;

$this->EndIpOff=ord($buf[4])+(ord($buf[5])*256)+(ord($buf[6])*256*256);

$this->StartIp=ord($buf[0])+(ord($buf[1])*256)+(ord($buf[2])*256*256)+(ord($buf[3])*256*256*256);

return $this->StartIp;

}

function getEndIp(){

@fseek ( $this->fp , $this->EndIpOff , SEEK_SET ) ;

$buf=fread ( $this->fp , 5 ) ;

$this->EndIp=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256);

$this->CountryFlag=ord ( $buf[4] ) ;

return $this->EndIp ;

}

function getCountry(){

switch ( $this->CountryFlag ) {

case 1:

case 2:

$this->Country=$this->getFlagStr ( $this->EndIpOff+4) ;

//echo sprintf('EndIpOffset=(%x)',$this->EndIpOff );

$this->Local=( 1 == $this->CountryFlag )? '' : $this->getFlagStr ( $this->EndIpOff+8);

break ;

default :

$this->Country=$this->getFlagStr ($this->EndIpOff+4);

$this->Local=$this->getFlagStr ( ftell ( $this->fp ));

}

}

function getFlagStr ($offset){

$flag=0 ;

while(1){

@fseek($this->fp ,$offset,SEEK_SET) ;

$flag=ord(fgetc($this->fp ) ) ;

if ( $flag == 1 || $flag == 2 ) {

$buf=fread ($this->fp , 3 ) ;

if ($flag==2){

$this->CountryFlag=2;

$this->EndIpOff=$offset - 4 ;

}

$offset=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])* 256*256);

}

else{

break ;

}

}

if($offset<12)

return '';

@fseek($this->fp , $offset , SEEK_SET ) ;

return $this->getStr();

}

function getStr ( )

{

$str='' ;

while ( 1 ) {

$c=fgetc ( $this->fp ) ;

//echo "$cn" ;

if(ord($c[0])== 0 )

break ;

$str.= $c ;

}

//echo "$str n";

return $str ;

}

function qqwry ($dotip='') {

if( !is_string($dotip) || $dotip==''){return;}

if(preg_match("/^127/",$dotip)){$this->Country="本地网络";return ;}

elseif(preg_match("/^192/",$dotip)) {$this->Country="局域网";return ;}

$nRet;

$ip=$this->IpToInt ( $dotip );

$this->fp= fopen(__QQWRY__, "rb");

if ($this->fp == NULL) {

$szLocal= "OpenFileError";

return 1;

}

@fseek ( $this->fp , 0 , SEEK_SET );

$buf=fread ( $this->fp , 8 );

$this->FirstStartIp=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256);

$this->LastStartIp=ord($buf[4]) + (ord($buf[5])*256) + (ord($buf[6])*256*256) + (ord($buf[7])*256*256*256);

$RecordCount= floor(($this->LastStartIp - $this->FirstStartIp) / 7);

if ($RecordCount <= 1){

$this->Country="FileDataError";

fclose($this->fp) ;

return 2 ;

}

$RangB= 0;

$RangE= $RecordCount;

// Match ...

while ($RangB < $RangE-1)

{

$RecNo= floor(($RangB + $RangE) / 2);

$this->getStartIp ( $RecNo ) ;

if ( $ip == $this->StartIp )

{

$RangB=$RecNo ;

break ;

}

if ($ip>$this->StartIp)

$RangB= $RecNo;

else

$RangE= $RecNo;

}

$this->getStartIp ( $RangB ) ;

$this->getEndIp ( ) ;

if ( ( $this->StartIp <= $ip ) && ( $this->EndIp >= $ip ) ){

$nRet=0 ;

$this->getCountry ( ) ;

//这样不太好..............所以..........

$this->Local=str_replace("area error", "",$this->Local);

}

else{

$nRet=3 ;

$this->Country='未知' ;

$this->Local='' ;

}

fclose ( $this->fp );

$this->Country=preg_replace("/(CZ88.NET)|(纯真网络)/","局域网/未知",$this->Country);

$this->Local=preg_replace("/(CZ88.NET)|(纯真网络)/","局域网/未知",$this->Local);

//看看 $nRet在上面的值是什么0和3,于是将下面的行注释掉

return $nRet ;

//return "$this->Country $this->Local";#如此直接返回位置和国家便可以了

}

function IpToInt($Ip) {

$array=explode('.',$Ip);

$Int=($array[0] * 256*256*256) + ($array[1]*256*256) + ($array[2]*256) + $array[3];

return $Int;

}

}

?>

实例演示如下:

$QQWry=new QQWry;

$QQWry->QQWry("60.31.95.255");

$country = $QQWry->Country;

echo $QQWry->Country.",".$QQWry->Local;

希望本文所述对大家的php程序设计有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理

在实际的运用开发中&#xff0c;跟数据库之间的交互是必不可少的&#xff0c;SpringBoot也提供了两种跟数据库交互的方式。 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板类&#xff0c;JdbcTemplate提供的方法进行增删改查的操作。 首先需要在pom文件中添加依赖:…

[html] webSocket怎么做兼容处理?

[html] webSocket怎么做兼容处理&#xff1f; Socket.IO:Adobe Flash Socket&#xff08;缺点&#xff1a;需要在服务器上打开一个额外的端口&#xff0c;默认为10843&#xff09;Ajax long pollingAjax multipart streamingForever iframeJSONP polling个人简介 我是歌谣&am…

农民第六次拯救中国

农民第六次拯救中国 英国《金融时报》中文网专栏作家吴晓波 2008-11-18 1989年&#xff0c;我第一次行走中国。在此之前&#xff0c;我是一个成长在江南城市里的文学青年&#xff0c;我只读到过课本上的中国&#xff0c;在用5个月时间踏遍南部中国之后&#xff0c;我在社会底层…

java base64转bitmap,如何将Bitmap位图与base64字符串相互转换

先引用delphi自带的单元uses EncdDecd;然后就可以使用下面二个函数了:///将Bitmap位图转化为base64字符串function BitmapToString(img:TBitmap):string ;varms:TMemoryStream;ss:TStringStream;s:string;beginms : TMemoryStream.Create;img.SaveToStream(ms);ss : TStringStr…

剑指offer——用两个栈实现队列

题目&#xff1a;用两个栈来实现一个队列&#xff0c;完成队列的Push和Pop操作。 队列中的元素为int类型。 解题思路&#xff1a; 当stack2不为空时&#xff0c;在stack2中的栈顶元素是最先进入队列的元素&#xff0c;可以弹出。当stack2为空时&#xff0c;我们把stack1中的元素…

[html] 解释下什么是ISISO8859-2字符集?

[html] 解释下什么是ISISO8859-2字符集&#xff1f; 这个知识点在非科班的来看算是比较偏门的了。 查了一下才知道&#xff0c;原来是Ascll扩展部分的字符集。ISO/IEC 8859-1&#xff0c;又称Latin-1或“西欧语言”&#xff0c;ISO/IEC 8859-2 Latin-2或“中欧语言”&#xff…

常系数线性递推的第n项及前n项和(转载)

&#xff08;一&#xff09;Fibonacci数列f[n]f[n-1]f[n-2],f[1]f[2]1的第n项的快速求法&#xff08;不考虑高精度&#xff09;. 解法&#xff1a; 考虑12的矩阵【f[n-2],f[n-1]】。根据fibonacci数列的递推关系&#xff0c;我们希望通过乘以一个22的矩阵&#xff0c;得到矩阵【…

Processes

转载于:https://www.cnblogs.com/EMH899/p/10844709.html

linux java 进程jvm 挂起,【jvm】jconsole远程linux上的java进程

1、启动java进程的命令在启动命令中添加如下信息-Djava.rmi.server.hostname192.169.1.71 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port10099 -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse说明-Djava.r…

[html] 说说video标签中预加载视频用到的属性是什么?

[html] 说说video标签中预加载视频用到的属性是什么&#xff1f; 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

CodeSmith 5.0工具实例篇系列4——根据表生成修改的存储过程,针对MS Sqlserver

运行该模板时&#xff0c;只需要选择单个表即可。 申明&#xff1a;该系列案例已通过CodeSmith Professional 5.0.1 Revision 4983版本的测试&#xff0c;以及生成的存储过程是针对MS Sqlserver。 操作说明 &#xff1a;运行CodeSmith Studio工具 &#xff0c;创建Blank Templa…

[html] HTML5中新添加的表单属性有哪些?

[html] HTML5中新添加的表单属性有哪些&#xff1f; 用的最多的就是一个 placeholder 属性了&#xff0c;其他的基本都不知道&#xff0c;借机学习下 HTML5 表单属性&#xff0c;学完之后感觉我们很多自定义表单可以不用做了&#xff0c;直接用原生的就好。如&#xff1a;list…

差分放大电路单端输出和双端输出区别以及应用(转载)

来自&#xff1a;http://www.elecfans.com/news/dianzi/20171118581901_a.html 什么是差分放大电路 差分放大电路利用电路参数的对称性和负反馈作用&#xff0c;有效地稳定静态工作点&#xff0c;以放大差模信号抑制共模信号为显著特征&#xff0c;广泛应用于直接耦合电路和测量…

php 识别语种,HYPHP增加多国语言支持 PHP通过用户浏览器判断来源国家方案

PHP可以通过获取浏览器发送的 ACCEPT_LANGUAGE去检测语言$_SERVER[HTTP_ACCEPT_LANGUAGE] 得到的值为 zh-CN,zh;q0.8zh-CN 我们只需要获取这段 后面的是, zh是中华的意思;q是页面权重的意思我们通过正则将 zh-CN获取出来if(!isset($_SERVER[HTTP_ACCEPT_LANGUAGE])) $_SERVER[…

[html] 给“测试投影”几个字添加立体投影的效果

[html] 给“测试投影”几个字添加立体投影的效果 text-shadow个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

python实现归并排序

# 将递归分解列表&#xff0c;直至最小&#xff08;即每个列表仅有一个元素&#xff09; # 将列表分解最小之后&#xff0c;递归合并两个列表&#xff0c;即挨个比较两个列表中最前面的元素&#xff0c;谁较小就将谁加入新的列表&#xff0c;而后该列表的下标后移一位&#xff…

php curl获取登陆cookie,PHP curl 模拟登陆 获取cookie

PHP curl 模拟登陆 获取cookie求助菜鸟学习使用PHP curl模拟登陆&#xff0c;等陆weiphon论坛时用以下代码成功&#xff0c;登陆www.xiaomi.com就死活成功不了&#xff0c;求助啊。窃以为是cookie获取有问题。麻烦牛人帮忙解决一下。苦思无所得夜不能寐啊&#xff01;$cookie_f…

Flash 缓存问题的解决(转)

Flash 缓存问题的解决 作者&#xff1a;wangwaizi 时间&#xff1a; 2003-12-27 文档类型&#xff1a;翻译 来自&#xff1a;蓝色理想 原文是Flash支持中心的两篇文章.解决Flash缓存问题 | 解决载入变量缓存问题 使用以下的方法&#xff0c;使SWF文件强制不从浏览器读本地…

[html] html5中的meta标签robots有什么作用?

[html] html5中的meta标签robots有什么作用&#xff1f; 禁止搜索引擎对本页面内容进行收录&#xff0c;不会出现在SRP页面上个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关…

java课程课后作业190502之单词统计续集

第1步&#xff1a;输出单个文件中的前 N 个最常出现的英语单词。 功能1&#xff1a;输出文件中所有不重复的单词&#xff0c;按照出现次数由多到少排列&#xff0c;出现次数同样多的&#xff0c;以字典序排列。 功能2&#xff1a; 指定文件目录&#xff0c;对目录下每一个文件执…