Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie einen IP-basierten Sprung in PHP

So implementieren Sie einen IP-basierten Sprung in PHP

藏色散人
藏色散人Original
2020-08-31 10:54:342508Durchsuche

PHP implementiert die Methode des Springens basierend auf der IP: Zuerst wird die Stadtzeichenfolge der aktuellen IP zurückgegeben; dann wird die IP-Datendatei geöffnet und die IP wird schließlich für die Suche zerlegt die passende IP aus dem Indexdatensatz aufzeichnen und entsprechende Ersetzungsvorgänge durchführen.

So implementieren Sie einen IP-basierten Sprung in PHP

Empfohlen: „PHP-Video-Tutorial

PHP-Code zur Bestimmung der Stadt anhand der IP und des Sprungs

Code:

<?php
//返回当前IP的城市字符串
function convertip($ip) {
    //IP数据文件路径
    $dat_path = &#39;QQWry.Dat&#39;;
    //检查IP地址
    if(!preg_match("/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/", $ip)) {
        return &#39;IP Address Error&#39;;
    }
    //打开IP数据文件
    if(!$fd = @fopen($dat_path, &#39;rb&#39;)){
        return &#39;IP date file not exists or access denied&#39;;
    }
    //分解IP进行运算,得出整形数
    $ip = explode(&#39;.&#39;, $ip);
    $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
    //获取IP数据索引开始和结束位置
    $DataBegin = fread($fd, 4);
    $DataEnd = fread($fd, 4);
    $ipbegin = implode(&#39;&#39;, unpack(&#39;L&#39;, $DataBegin));
    if($ipbegin < 0) $ipbegin += pow(2, 32);
    $ipend = implode(&#39;&#39;, unpack(&#39;L&#39;, $DataEnd));
    if($ipend < 0) $ipend += pow(2, 32);
    $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
    $BeginNum = 0;
    $EndNum = $ipAllNum;
    //使用二分查找法从索引记录中搜索匹配的IP记录
    while($ip1num>$ipNum || $ip2num<$ipNum) {
        $Middle= intval(($EndNum + $BeginNum) / 2);
        //偏移指针到索引位置读取4个字节
        fseek($fd, $ipbegin + 7 * $Middle);
        $ipData1 = fread($fd, 4);
        if(strlen($ipData1) < 4) {
            fclose($fd);
            return &#39;System Error&#39;;
        }
        //提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
        $ip1num = implode(&#39;&#39;, unpack(&#39;L&#39;, $ipData1));
        if($ip1num < 0) $ip1num += pow(2, 32);
        //提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
        if($ip1num > $ipNum) {
            $EndNum = $Middle;
            continue;
        }
        //取完上一个索引后取下一个索引
        $DataSeek = fread($fd, 3);
        if(strlen($DataSeek) < 3) {
            fclose($fd);
            return &#39;System Error&#39;;
        }
        $DataSeek = implode(&#39;&#39;, unpack(&#39;L&#39;, $DataSeek.chr(0)));
        fseek($fd, $DataSeek);
        $ipData2 = fread($fd, 4);
        if(strlen($ipData2) < 4) {
            fclose($fd);
            return &#39;System Error&#39;;
        }
        $ip2num = implode(&#39;&#39;, unpack(&#39;L&#39;, $ipData2));
        if($ip2num < 0) $ip2num += pow(2, 32);
        //没找到提示未知
        if($ip2num < $ipNum) {
            if($Middle == $BeginNum) {
                fclose($fd);
                return &#39;Unknown&#39;;
            }
            $BeginNum = $Middle;
        }
    }
    $ipFlag = fread($fd, 1);
    if($ipFlag == chr(1)) {
        $ipSeek = fread($fd, 3);
        if(strlen($ipSeek) < 3) {
            fclose($fd);
            return &#39;System Error&#39;;
        }
        $ipSeek = implode(&#39;&#39;, unpack(&#39;L&#39;, $ipSeek.chr(0)));
        fseek($fd, $ipSeek);
        $ipFlag = fread($fd, 1);
    }
    if($ipFlag == chr(2)) {
        $AddrSeek = fread($fd, 3);
        if(strlen($AddrSeek) < 3) {
            fclose($fd);
            return &#39;System Error&#39;;
        }
        $ipFlag = fread($fd, 1);
        if($ipFlag == chr(2)) {
            $AddrSeek2 = fread($fd, 3);
            if(strlen($AddrSeek2) < 3) {
                fclose($fd);
                return &#39;System Error&#39;;
            }
            $AddrSeek2 = implode(&#39;&#39;, unpack(&#39;L&#39;, $AddrSeek2.chr(0)));
            fseek($fd, $AddrSeek2);
        } else {
            fseek($fd, -1, SEEK_CUR);
        }
        while(($char = fread($fd, 1)) != chr(0))
            $ipAddr2 .= $char;
        $AddrSeek = implode(&#39;&#39;, unpack(&#39;L&#39;, $AddrSeek.chr(0)));
        fseek($fd, $AddrSeek);
        while(($char = fread($fd, 1)) != chr(0))
            $ipAddr1 .= $char;
    } else {
        fseek($fd, -1, SEEK_CUR);
        while(($char = fread($fd, 1)) != chr(0))
            $ipAddr1 .= $char;
        $ipFlag = fread($fd, 1);
        if($ipFlag == chr(2)) {
            $AddrSeek2 = fread($fd, 3);
            if(strlen($AddrSeek2) < 3) {
                fclose($fd);
                return &#39;System Error&#39;;
            }
            $AddrSeek2 = implode(&#39;&#39;, unpack(&#39;L&#39;, $AddrSeek2.chr(0)));
            fseek($fd, $AddrSeek2);
        } else {
            fseek($fd, -1, SEEK_CUR);
        }
        while(($char = fread($fd, 1)) != chr(0)){
            $ipAddr2 .= $char;
        }
    }
    fclose($fd);
    //最后做相应的替换操作后返回结果
    if(preg_match(&#39;/http/i&#39;, $ipAddr2)) {
        $ipAddr2 = &#39;&#39;;
    }
    $ipaddr = "$ipAddr1 $ipAddr2";
    $ipaddr = preg_replace(&#39;/CZ88.Net/is&#39;, &#39;&#39;, $ipaddr);
    $ipaddr = preg_replace(&#39;/^s*/is&#39;, &#39;&#39;, $ipaddr);
    $ipaddr = preg_replace(&#39;/s*$/is&#39;, &#39;&#39;, $ipaddr);
    if(preg_match(&#39;/http/i&#39;, $ipaddr) || $ipaddr == &#39;&#39;) {
        $ipaddr = &#39;Unknown&#39;;
    }
    return $ipaddr;
}
//查找字符串
function  findstr($str, $substr)
{
         $m = strlen($str);
        $n = strlen($substr );
        if ($m < $n) return false ;
        for ($i=0; $i <=($m-$n+1); $i ++){
                $sub = substr( $str, $i, $n);
                if ( strcmp($sub, $substr) ==  0)  return true;
        }
        return false ;
}
 
$xp_UserIp = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
$Clientip = ($xp_UserIp) ? $xp_UserIp : $_SERVER["REMOTE_ADDR"];
$ClientSity=convertip($Clientip);
if (findstr($ClientSity,"北京")){
    //out.print("beijing");
    Header("Location: http://www.qq.com");
}else{
    //out.print("false beijing");
    Header("Location: http://www.163.com");
}
?>

Das obige ist der detaillierte Inhalt vonSo implementieren Sie einen IP-basierten Sprung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn