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 相关文章推荐
留言板翻页的实现详解
Oct 09 PHP
PHPMYADMIN 简明安装教程 推荐
Mar 07 PHP
解析htaccess伪静态的规则
Jun 18 PHP
Zend studio文件注释模板设置方法
Sep 29 PHP
php smarty truncate UTF8乱码问题解决办法
Jun 13 PHP
PHP 读取和编写 XML
Nov 19 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
PHP中的命名空间相关概念浅析
Jan 22 PHP
php利用事务处理转账问题
Apr 22 PHP
php 可变函数使用小结
Jun 12 PHP
laravel 创建命令行命令的图文教程
Oct 23 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防止注入攻击实例分析
2014/11/03 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
jquery.post用法示例代码
2014/01/03 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
JavaScript组件开发完整示例
2015/12/15 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
JS实现仿PS的调色板效果完整实例
2016/12/21 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
Python3写入文件常用方法实例分析
2015/05/22 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
Python进程间通信之共享内存详解
2017/10/30 Python
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
CSS 实现多彩、智能的阴影效果
2021/05/12 HTML / CSS
实战Python爬虫爬取酷我音乐
2022/04/11 Python
LeetCode189轮转数组python示例
2022/08/05 Python