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+MySQL的聊天室设计
Oct 09 PHP
一个简易需要注册的留言版程序
Oct 09 PHP
php下清空字符串中的HTML标签的代码
Sep 06 PHP
Fine Uploader文件上传组件应用介绍
Jan 06 PHP
php顺序查找和二分查找示例
Mar 27 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
Ajax实现对静态页面的文章访问统计功能示例
Oct 10 PHP
PHP Header用于页面跳转时的几个注意事项
Oct 21 PHP
PHP版微信小店接口开发实例
Nov 12 PHP
ThinkPHP 模板引擎使用详解
May 07 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
Apr 27 PHP
详解php命令注入攻击
Apr 06 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
对javascript和select部件的结合运用
2006/10/09 PHP
如何让CI框架支持service层
2014/10/29 PHP
php去掉文件前几行的方法
2015/07/29 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
javascript运动详解
2015/07/06 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
2017/07/11 jQuery
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
利用python绘制正态分布曲线
2021/01/04 Python
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
IE9下html5初试小刀
2010/09/21 HTML / CSS
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
俄罗斯最大的香水和化妆品网上商店:Randewoo
2020/11/05 全球购物
周年庆典主持词
2014/04/02 职场文书
2015年组织部工作总结
2015/04/03 职场文书
大学毕业晚会开场白
2015/05/29 职场文书
房产证明范本
2015/06/19 职场文书
python爬虫请求库httpx和parsel解析库的使用测评
2021/05/10 Python
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
《废话连篇——致新手》——chinapizza
2022/04/05 无线电
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python