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


Posted in PHP onMarch 25, 2015

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

<?php  
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&amp;java(一)
Oct 09 PHP
用PHP实现多级树型菜单
Oct 09 PHP
php 之 没有mysql支持时的替代方案
Oct 09 PHP
PHP MemCached高级缓存配置图文教程
Aug 05 PHP
php比较多维数组中值的大小排序实现代码
Sep 08 PHP
php function用法如何递归及return和echo区别
Mar 07 PHP
PHP实现扎金花游戏之大小比赛的方法
Mar 10 PHP
一个完整的PHP类包含的七种语法说明
Jun 04 PHP
老版本PHP转义Json里的特殊字符的函数
Jun 08 PHP
PHP编程计算日期间隔天数的方法
Apr 26 PHP
Yii框架响应组件用法实例分析
Sep 04 PHP
在TP5数据库中四个字段实现无限分类的示例
Oct 18 PHP
PHP使用in_array函数检查数组中是否存在某个值
Mar 25 #PHP
PHP+MYSQL实现用户的增删改查
Mar 24 #PHP
php创建多级目录的方法
Mar 24 #PHP
php简单获取目录列表的方法
Mar 24 #PHP
php简单获取文件扩展名的方法
Mar 24 #PHP
php控制文件下载速度的方法
Mar 24 #PHP
使用 PHPStorm 开发 Laravel
Mar 24 #PHP
You might like
php处理文件的小例子(解压缩,删除目录)
2013/02/03 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
详解json在php中的应用
2018/09/30 PHP
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
python实现求两个字符串的最长公共子串方法
2018/07/20 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
Django认证系统实现的web页面实现代码
2019/08/12 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
英国知名小木屋定制网站:Tiger Sheds
2020/03/06 全球购物
学期研究性学习个人的自我评价
2014/01/09 职场文书
研修第一天随笔感言
2014/02/15 职场文书
2014世界杯球队球队口号
2014/06/05 职场文书
企业安全生产标语
2014/06/06 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
2014年信访工作总结
2014/11/17 职场文书
《家庭教育》读后感3篇
2019/12/18 职场文书
vue首次渲染全过程
2021/04/21 Vue.js