国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP獲取IP地址所在地信息的實例(使用純真IP數據庫qqwry.dat)

2024-05-04 23:52:21
字體:
來源:轉載
供稿:網友

如下所示:

<?php $data = '254.254.254.254'; echo ip2long($data);   function getIP() {   if(getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))   $ip = getenv("HTTP_CLIENT_IP");   elseif(getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))   $ip = getenv("HTTP_X_FORWARDED_FOR");   elseif (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))   $ip = getenv("REMOTE_ADDR");   elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))   $ip = $_SERVER['REMOTE_ADDR'];   else   $ip = "0.0.0.0";   return $ip; }   class IpLocation {   //數據文件指針   var $fp;   var $firstip;   var $lastip;   var $totalip;     function getlong() {    //unpack從二進制字符串對數據進行解包    //將讀取的little-endian編碼的4個字節轉化為長整型數,fread安全讀取二進制文件    $result = unpack('Vlong', fread($this->fp, 4));    return $result['long'];   }     function getlong3() {    //將讀取的little-endian編碼的3個字節轉化為長整型數    $result = unpack('Vlong', fread($this->fp, 3).chr(0));    return $result['long'];   }     function packip($ip) {    //pack把數據裝入一個二進制字符串    //ip2long將IP地址轉成無符號的長整型,也可以用來驗證IP地址    return pack('N', intval(ip2long($ip)));   }     function getstring($data = "") {    $char = fread($this->fp, 1);    while (ord($char) > 0) {    //ord返回字符的ASCII值,字符串按照C格式保存,以/0結束      $data .= $char;      $char = fread($this->fp, 1);    }    return $data;   }     function getarea() {    $byte = fread($this->fp, 1);  // 標志字節    switch (ord($byte)) {      case 0:           // 沒有區域信息        $area = "";        break;      case 1:      case 2:           // 標志字節為1或2,表示區域信息被重定向        fseek($this->fp, $this->getlong3());        $area = $this->getstring();        break;      default:          // 否則,表示區域信息沒有被重定向        $area = $this->getstring($byte);        break;    }    return $area;   }     function getlocation($ip) {    if (!$this->fp) return null;      // 如果數據文件沒有被正確打開,則直接返回空    $location['ip'] = gethostbyname($ip);  // 域名轉化為IP地址    $ip = $this->packip($location['ip']);  // 將輸入的IP地址轉化為可比較的IP地址    // 不合法的IP地址會被轉化為255    // 對分搜索    $l = 0;             // 搜索的下邊界    $u = $this->totalip;      // 搜索的上邊界    $findip = $this->lastip;    // 如果沒有找到就返回最后一條IP記錄(QQWry.Dat的版本信息)    while ($l <= $u) {       // 當上邊界小于下邊界時,查找失敗      $i = floor(($l + $u) / 2); // 計算近似中間記錄      fseek($this->fp, $this->firstip + $i * 7);      $beginip = strrev(fread($this->fp, 4));   // 獲取中間記錄的開始IP地址,strrev反轉字符串      // strrev函數在這里的作用是將little-endian的壓縮IP地址轉化為big-endian的格式,便于比較      //關于little-endian與big-endian 參考:http://baike.baidu.com/view/2368412.htm      if ($ip < $beginip) {    // 用戶的IP小于中間記錄的開始IP地址時        $u = $i - 1;      // 將搜索的上邊界修改為中間記錄減一      }      else {        fseek($this->fp, $this->getlong3());        $endip = strrev(fread($this->fp, 4));  // 獲取中間記錄的結束IP地址        if ($ip > $endip) {   // 用戶的IP大于中間記錄的結束IP地址時          $l = $i + 1;    // 將搜索的下邊界修改為中間記錄加一        }        else {         // 用戶的IP在中間記錄的IP范圍內時          $findip = $this->firstip + $i * 7;          break;       // 則表示找到結果,退出循環        }      }    }      fseek($this->fp, $findip);    $location['beginip'] = long2ip($this->getlong());  // 用戶IP所在范圍的開始地址    $offset = $this->getlong3();    fseek($this->fp, $offset);    $location['endip'] = long2ip($this->getlong());   // 用戶IP所在范圍的結束地址    $byte = fread($this->fp, 1);  // 標志字節    switch (ord($byte)) {      case 1:           // 標志字節為1,表示國家和區域信息都被同時重定向        $countryOffset = $this->getlong3();     // 重定向地址        fseek($this->fp, $countryOffset);        $byte = fread($this->fp, 1);  // 標志字節        switch (ord($byte)) {          case 2:       // 標志字節為2,表示國家信息又被重定向           fseek($this->fp, $this->getlong3());           $location['country'] = $this->getstring();           fseek($this->fp, $countryOffset + 4);           $location['area'] = $this->getarea();           break;          default:      // 否則,表示國家信息沒有被重定向           $location['country'] = $this->getstring($byte);           $location['area'] = $this->getarea();           break;        }        break;      case 2:           // 標志字節為2,表示國家信息被重定向        fseek($this->fp, $this->getlong3());        $location['country'] = $this->getstring();        fseek($this->fp, $offset + 8);        $location['area'] = $this->getarea();        break;      default:          // 否則,表示國家信息沒有被重定向        $location['country'] = $this->getstring($byte);        $location['area'] = $this->getarea();        break;    }    if ($location['country'] == " CZNET") { // CZNET表示沒有有效信息      $location['country'] = "未知";    }    if ($location['area'] == " CZNET") {      $location['area'] = "";    }    return $location;   }   /**   * 構造函數,打開 QQWry.Dat 文件并初始化類中的信息   */   function IpLocation($filename = "qqwry.dat") {    $this->fp = 0;    if (($this->fp = @fopen($filename, 'rb')) !== false) {      $this->firstip = $this->getlong();      $this->lastip = $this->getlong();      $this->totalip = ($this->lastip - $this->firstip) / 7;      //注冊析構函數,使其在程序執行結束時執行      register_shutdown_function(array(&$this, '_IpLocation'));    }   }   /**   * 析構函數,用于在頁面執行結束后自動關閉打開的文件   */   function _IpLocation() {    if ($this->fp) {      fclose($this->fp);    }    $this->fp = 0;   } } header("content-Type: text/html; charset=gbk"); $ipOrDomain='110.0.0.0'; //$ipOrDomain='www.baidu.com'; $iplocation = new IpLocation(); $location = $iplocation->getlocation($ipOrDomain); $address=mb_convert_encoding($location['country'].$location['area'], "gbk", "gbk"); echo $address; ?>

以上這篇PHP獲取IP地址所在地信息的實例(使用純真IP數據庫qqwry.dat)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 旺苍县| 黄骅市| 含山县| 尚志市| 鄂伦春自治旗| 稻城县| 白沙| 嘉定区| 碌曲县| 和田县| 和静县| 临夏市| 礼泉县| 额尔古纳市| 图木舒克市| 崇明县| 天台县| 牙克石市| 鄂尔多斯市| 花莲市| 丽江市| 万州区| 霸州市| 新巴尔虎右旗| 永城市| 阿拉尔市| 鸡东县| 舞钢市| 防城港市| 左云县| 固始县| 南康市| 会泽县| 裕民县| 永仁县| 嘉兴市| 中方县| 洛扎县| 磴口县| 鄢陵县| 抚宁县|