分享

PHP调用纯真IP数据库返回具体地址

 丶平上 2016-09-01

本文主要是说PHP如何使用纯真IP数据库

我提供一个方法给大家

[plain] view plain copy
  1. function convertip($ip) {   
  2.   $ip1num = 0;  
  3.   $ip2num = 0;  
  4.   $ipAddr1 ="";  
  5.   $ipAddr2 ="";  
  6.   $dat_path = './QQWry.Dat';          
  7.   if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {   
  8.     return 'IP Address Error';   
  9.   }    
  10.   if(!$fd = @fopen($dat_path, 'rb')){   
  11.     return 'IP date file not exists or access denied';   
  12.   }    
  13.   $ip = explode('.', $ip);   
  14.   $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];    
  15.   $DataBegin = fread($fd, 4);   
  16.   $DataEnd = fread($fd, 4);   
  17.   $ipbegin = implode('', unpack('L', $DataBegin));   
  18.   if($ipbegin < 0) $ipbegin += pow(2, 32);   
  19.     $ipend = implode('', unpack('L', $DataEnd));   
  20.   if($ipend < 0) $ipend += pow(2, 32);   
  21.     $ipAllNum = ($ipend - $ipbegin) / 7 + 1;   
  22.   $BeginNum = 0;   
  23.   $EndNum = $ipAllNum;    
  24.   while($ip1num>$ipNum || $ip2num<$ipNum) {   
  25.     $Middle= intval(($EndNum + $BeginNum) / 2);   
  26.     fseek($fd, $ipbegin + 7 * $Middle);   
  27.     $ipData1 = fread($fd, 4);   
  28.     if(strlen($ipData1) < 4) {   
  29.       fclose($fd);   
  30.       return 'System Error';   
  31.     }  
  32.     $ip1num = implode('', unpack('L', $ipData1));   
  33.     if($ip1num < 0) $ip1num += pow(2, 32);   
  34.   
  35.     if($ip1num > $ipNum) {   
  36.       $EndNum = $Middle;   
  37.       continue;   
  38.     }   
  39.     $DataSeek = fread($fd, 3);   
  40.     if(strlen($DataSeek) < 3) {   
  41.       fclose($fd);   
  42.       return 'System Error';   
  43.     }   
  44.     $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));   
  45.     fseek($fd, $DataSeek);   
  46.     $ipData2 = fread($fd, 4);   
  47.     if(strlen($ipData2) < 4) {   
  48.       fclose($fd);   
  49.       return 'System Error';   
  50.     }   
  51.     $ip2num = implode('', unpack('L', $ipData2));   
  52.     if($ip2num < 0) $ip2num += pow(2, 32);    
  53.       if($ip2num < $ipNum) {   
  54.         if($Middle == $BeginNum) {   
  55.           fclose($fd);   
  56.           return 'Unknown';   
  57.         }   
  58.         $BeginNum = $Middle;   
  59.       }   
  60.     }    
  61.     $ipFlag = fread($fd, 1);   
  62.     if($ipFlag == chr(1)) {   
  63.       $ipSeek = fread($fd, 3);   
  64.       if(strlen($ipSeek) < 3) {   
  65.         fclose($fd);   
  66.         return 'System Error';   
  67.       }   
  68.       $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));   
  69.       fseek($fd, $ipSeek);   
  70.       $ipFlag = fread($fd, 1);   
  71.     }   
  72.     if($ipFlag == chr(2)) {   
  73.       $AddrSeek = fread($fd, 3);   
  74.       if(strlen($AddrSeek) < 3) {   
  75.       fclose($fd);   
  76.       return 'System Error';   
  77.     }   
  78.     $ipFlag = fread($fd, 1);   
  79.     if($ipFlag == chr(2)) {   
  80.       $AddrSeek2 = fread($fd, 3);   
  81.       if(strlen($AddrSeek2) < 3) {   
  82.         fclose($fd);   
  83.         return 'System Error';   
  84.       }   
  85.       $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));   
  86.       fseek($fd, $AddrSeek2);   
  87.     } else {   
  88.       fseek($fd, -1, SEEK_CUR);   
  89.     }   
  90.     while(($char = fread($fd, 1)) != chr(0))   
  91.     $ipAddr2 .= $char;   
  92.     $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));   
  93.     fseek($fd, $AddrSeek);   
  94.     while(($char = fread($fd, 1)) != chr(0))   
  95.     $ipAddr1 .= $char;   
  96.   } else {   
  97.     fseek($fd, -1, SEEK_CUR);   
  98.     while(($char = fread($fd, 1)) != chr(0))   
  99.     $ipAddr1 .= $char;   
  100.     $ipFlag = fread($fd, 1);   
  101.     if($ipFlag == chr(2)) {   
  102.       $AddrSeek2 = fread($fd, 3);   
  103.       if(strlen($AddrSeek2) < 3) {   
  104.         fclose($fd);   
  105.         return 'System Error';   
  106.       }   
  107.       $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));   
  108.       fseek($fd, $AddrSeek2);   
  109.     } else {   
  110.       fseek($fd, -1, SEEK_CUR);   
  111.     }   
  112.     while(($char = fread($fd, 1)) != chr(0)){   
  113.       $ipAddr2 .= $char;   
  114.     }   
  115.   }   
  116.   fclose($fd);    
  117.   if(preg_match('/http/i', $ipAddr2)) {   
  118.     $ipAddr2 = '';   
  119.   }   
  120.   $ipaddr = "$ipAddr1 $ipAddr2";   
  121.   $ipaddr = preg_replace('/CZ88.NET/is', '', $ipaddr);   
  122.   $ipaddr = preg_replace('/^s*/is', '', $ipaddr);   
  123.   $ipaddr = preg_replace('/s*$/is', '', $ipaddr);   
  124.   if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {   
  125.     $ipaddr = 'Unknown';   
  126.   }   
  127.   return $ipaddr;   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多