本文实例讲述了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程序设计有所帮助。

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

  1. php多城市分站cms,织梦dedecms内核最新全国多城市分站地区插件

    源码介绍 织梦DEDECMS内核最新全国多城市分站地区插件 织梦城市分站插件系统使用说明 温馨提示:使用前请先备份网站,以防万一. 1.系统设置: 核心设置-- 是否使用伪静态:是 其他选项-- 模板 ...

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

    class QQWry{ var $StartIP=0; var $EndIP=0; var $Country=''; var $Local=''; var $CountryFlag=0; // 标识 ...

  3. ngin IP跳域名 域名跳域名 if多判断

    域名直接跳域名 server {listen 80;server_name www.test123.com;rewrite ^/(.*) http://www.test456.com/$1 perma ...

  4. php 判断 ip 城市,利用PHP怎么根据IP地址判断城市

    利用PHP怎么根据IP地址判断城市 发布时间:2020-12-25 16:11:48 来源:亿速云 阅读:89 作者:Leah 这期内容当中小编将会给大家带来有关利用PHP怎么根据IP地址判断城市,文 ...

  5. PbootCMS城市分站插件 生成任意城市的分站链接地址 支持分站同页跳转 实现dedecms织梦城市分站插件效果

    插件介绍 基于PbootCMS v3.1.3制作的城市分站插件.自动生成任意城市的分站链接,同时支持分站之间同页跳转. PbootCMS城市分站插件 生成任意城市的分站链接地址 支持分站同页跳转 - ...

  6. 简单介绍python3判断IP地址的方法

    这篇文章主要为大家详细介绍了python3判断IP地址的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了python3判断IP地址的具体代码,供 ...

  7. Shell脚本判断IP是否合法性(多种方法)

    运维角度来说,写shell脚本经常会遇到判断输入的值是否合法,比如IP.邮件地址等.那么,根据自身写脚本中总结的判断IP合法性脚本分享给网友,遇到时能有所参考. 思路:IP由四位数字组成,以点分割,每 ...

  8. python3 判断ip有效性 是否是内网ip

    1.判断ip有效性 import ipaddressdef check_ip_valid(ip):try:ipaddress.ip_address(ip.strip())return Trueexce ...

  9. golang 获取公网ip 内网ip 检测ip类型 校验ip区间 ip地址string和int转换 判断ip地区国家运营商

    目录 简要简介net包 什么是外网IP和内网IP? 获取公网ip 获取本地ip 判断是否是公网ip ip地址string转int ip地址int转string 判断ip地址区间 通过淘宝接口根据公网i ...

最新文章

  1. unity不规则碰撞_Unity UGUI学习系列(二) ------ PolygonCollider2D实现不规则碰撞范围
  2. 详解Javascript中的Object对象
  3. 剑指offer之求两个数之和(不能使用四则运算)
  4. 【李宏毅2020 ML/DL】P82 Generative Adversarial Network | Improving Sequence Generation by GAN
  5. python自定义损失函数_自定义损失函数sklearn
  6. DELPHI2007 安装ACTIVEX插件的方法
  7. Android模仿新浪微博(前言)
  8. 仪表框架 3500/05-01-01-00/HONEYWELL51403776-100
  9. 放量跌与缩量跌的区别是什么?
  10. 云管理服务MSP扫盲
  11. Hbase Schema设计与数据模型操作
  12. Win7 运行bat批处理文件时怎么隐藏cmd命令提示符窗口
  13. 在外企上班是一种什么体验?附国内热门外企公司名单!
  14. Android 生成自己的签名key(releasekey platform shared media networkstack verify等)
  15. Java语言中抽取word、pdf的四种方法
  16. 转载:SFC /SCANNOW发现损坏文件应对方法参考
  17. Redis 安装部署教程
  18. 拼多多为什么不显示评论
  19. 【开源免费】微软官方推荐的桌面小工具
  20. oh-my-zsh主题power10k安装配置教程

热门文章

  1. [软技能] png-8和png-24有什么区别?
  2. [html] 使用svg画一个微信的logo
  3. [html] 简述下html5的离线储存原理,同时说明如何使用?
  4. [vue] 在移动端使用vue,你觉得最佳实践有哪些?
  5. [css] 请写出:link、:visited、:hover、:active的执行顺序
  6. 工作260:js判断一个数组是否包含一个指定的值
  7. 前端学习(2006)vue之电商管理系统电商系统之绘制商品参数的复选框
  8. 前端学习(1285):node运行环境安装
  9. 前端学习(1269):axios的拦截器
  10. mysql临时关闭索引功能_MYSQL中常用的强制性操作(例如强制索引)