PHP判斷IP并轉(zhuǎn)跳到相應(yīng)城市分站的方法
本文實(shí)例講述了PHP判斷IP并轉(zhuǎn)跳到相應(yīng)城市分站的方法。分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:
<?php
class QQWry{
var $StartIP=0;
var $EndIP=0;
var $Country='';
var $Local='';
var $CountryFlag=0;
// 標(biāo)識(shí) Country位置
// 0x01,隨后3字節(jié)為Country偏移,沒(méi)有Local
// 0x02,隨后3字節(jié)為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="本地網(wǎng)絡(luò)";return ;}
elseif(preg_match("/^192/",$dotip)) {$this->Country="局域網(wǎng)";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)|(純真網(wǎng)絡(luò))/","局域網(wǎng)/未知",$this->Country);
$this->Local=preg_replace("/(CZ88.NET)|(純真網(wǎng)絡(luò))/","局域網(wǎng)/未知",$this->Local);
//////////////看看 $nRet在上面的值是什么0和3,于是將下面的行注釋掉
return $nRet ;
//return "$this->Country $this->Local";#如此直接返回位置和國(guó)家便可以了
}
function IpToInt($Ip) {
$array=explode('.',$Ip);
$Int=($array[0] * 256*256*256) + ($array[1]*256*256) + ($array[2]*256) + $array[3];
return $Int;
}
}
?>
實(shí)例演示如下:
$QQWry=new QQWry;
$QQWry->QQWry("60.31.95.255");
$country = $QQWry->Country;
echo $QQWry->Country.",".$QQWry->Local;
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。
相關(guān)文章
Linux下CoreSeek及PHP擴(kuò)展模塊的安裝
前提條件是系統(tǒng)己安裝完成apache mysql php的WEB服務(wù)。我是以yum來(lái)安裝的。如果你沒(méi)有安裝過(guò)請(qǐng)按照下面給出的鏈接先完成基本的LAMP環(huán)境的安裝2012-09-09
PHP swoole和redis異步任務(wù)實(shí)現(xiàn)方法分析
這篇文章主要介紹了PHP swoole和redis異步任務(wù)實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式對(duì)比分析了swoole和redis異步任務(wù)具體實(shí)現(xiàn)方法及區(qū)別,需要的朋友可以參考下2019-08-08
Yii使用queue實(shí)現(xiàn)隊(duì)列流程講解
Yii是一個(gè)高性能的PHP5的web應(yīng)用程序開(kāi)發(fā)框架。通過(guò)一個(gè)簡(jiǎn)單的命令行工具yiic可以快速創(chuàng)建一個(gè)web應(yīng)用程序的代碼框架,開(kāi)發(fā)者可以在生成的代碼框架基礎(chǔ)上添加業(yè)務(wù)邏輯,以快速完成應(yīng)用程序的開(kāi)發(fā)2022-11-11
php中g(shù)et_object_vars()方法用法實(shí)例
這篇文章主要介紹了php中g(shù)et_object_vars()方法用法,實(shí)例分析了get_object_vars()方法獲取對(duì)象中屬性的使用技巧,需要的朋友可以參考下2015-02-02
php實(shí)現(xiàn)轉(zhuǎn)換html格式為文本格式的方法
這篇文章主要介紹了php實(shí)現(xiàn)轉(zhuǎn)換html格式為文本格式的方法,通過(guò)一個(gè)自定義函數(shù)實(shí)現(xiàn)針對(duì)HTML標(biāo)簽的過(guò)濾,涉及php正則替換的相關(guān)操作技巧,需要的朋友可以參考下2016-05-05
PHP實(shí)現(xiàn)通過(guò)中文字符比率來(lái)判斷垃圾評(píng)論的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)通過(guò)中文字符比率來(lái)判斷垃圾評(píng)論的方法,是一個(gè)比較實(shí)用的技巧,對(duì)于進(jìn)行PHP應(yīng)用程序開(kāi)發(fā)來(lái)說(shuō)有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10

