<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. php語言

    如何進行PHP查詢ip所在地

    時間:2025-04-16 00:47:48 php語言 我要投稿
    • 相關推薦

    如何進行PHP查詢ip所在地

      導語:如何進行PHP查詢ip所在地呢?下面是小編給大家提供的實現方法,大家可以參考閱讀,更多詳情請關注應屆畢業生考試網。

      具體實現方法如下:

      代碼如下:

      <?php

      /**

      *@ date         2010.12.21

      注:文件頭 [第一條索引的偏移量 (4byte)] + [最后一條索引的偏移地址 (4byte)]     8字節

      記錄區 [結束ip (4byte)] + [地區1] + [地區2]                                4字節+不定長

      索引區 [開始ip (4byte)] + [指向記錄區的偏移地址 (3byte)]                   7字節

      */

      class iplocation{

      var $fp;

      var $firstip;  //第一條ip索引的偏移地址

      var $lastip;   //最后一條ip索引的偏移地址

      var $totalip;  //總ip數

      /*

      |----------------------------------------------------------------------------

      | 構造函數,初始化一些變量

      |----------------------------------------------------------------------------

      |

      */

      function iplocation($datfile = "qqwry.dat"){

      $this->fp=fopen($datfile,'rb')or die("qqwry.dat不存在,請去網上 <a href='http://www.jb51.net/softs/10529.html'>下載純真ip數據 庫</a>, 'qqwry.dat' 放到當前目錄下");   //二制方式打開

      $this->firstip = $this->get4b(); //第一條ip索引的絕對偏移地址

      $this->lastip = $this->get4b();  //最后一條ip索引的絕對偏移地址

      $this->totalip =($this->lastip - $this->firstip)/7 ; //ip總數 索引區是定長的7個字節,在此要除以7,

      register_shutdown_function(array($this,"closefp"));  //為了兼容php5以下版本,本類沒有用析構函數,自動關閉ip庫.

      }

      /*

      |----------------------------------------------------------------------------

      | 關閉ip庫

      |----------------------------------------------------------------------------

      |

      */

      function closefp(){

      fclose($this->fp);

      }

      /*

      |----------------------------------------------------------------------------

      | 讀取4個字節并將解壓成long的長模式

      |----------------------------------------------------------------------------

      |

      */

      function get4b(){

      $str=unpack("v",fread($this->fp,4));

      return $str[1];

      }

      /*

      |----------------------------------------------------------------------------

      | 讀取重定向了的偏移地址

      |----------------------------------------------------------------------------

      |

      */

      function getoffset(){

      $str=unpack("v",fread($this->fp,3).chr(0));

      return $str[1];

      }

      /*

      |----------------------------------------------------------------------------

      | 讀取ip的詳細地址信息

      |----------------------------------------------------------------------------

      |

      */

      function getstr(){

      $split=fread($this->fp,1);

      while (ord($split)!=0) {

      $str .=$split;

      $split=fread($this->fp,1);

      }

      return $str;

      }

      /*

      |----------------------------------------------------------------------------

      | 將ip通過ip2long轉成ipv4的互聯網地址,再將他壓縮成big-endian字節序 ,用來和索引區內的ip地址做比較

      |----------------------------------------------------------------------------

      |

      */

      function iptoint($ip){

      return pack("n",intval(ip2long($ip)));

      }

      /*

      |----------------------------------------------------------------------------

      | 獲取地址信息

      |----------------------------------------------------------------------------

      |

      */

      function readaddress(){

      $now_offset=ftell($this->fp); //得到當前的指針位址

      $flag=$this->getflag();

      switch (ord($flag)){

      case 0:

      $address="";

      break;

      case 1:

      case 2:

      fseek($this->fp,$this->getoffset());

      $address=$this->getstr();

      break;

      default:

      fseek($this->fp,$now_offset);

      $address=$this->getstr();

      break;

      }

      return $address;

      }

      /*

      |----------------------------------------------------------------------------

      | 獲取標志1或2   用來確定地址是否重定向了

      |----------------------------------------------------------------------------

      |

      */

      function getflag(){

      return fread($this->fp,1);

      }

      /*

      |----------------------------------------------------------------------------

      | 用二分查找法在索引區內搜索ip

      |----------------------------------------------------------------------------

      |

      */

      function searchip($ip){

      $ip=gethostbyname($ip);     //將域名轉成ip

      $ip_offset["ip"]=$ip;

      $ip=$this->iptoint($ip);    //將ip轉換成長整型

      $firstip=0;                 //搜索的上邊界

      $lastip=$this->totalip;     //搜索的下邊界

      $ipoffset=$this->lastip;    //初始化為最后一條ip地址的偏移地址

      while ($firstip <= $lastip){

      $i=floor(($firstip + $lastip) / 2);          //計算近似中間記錄 floor函數記算給定浮點數小的最大整數,說白了就是四舍五也舍

      fseek($this->fp,$this->firstip + $i * 7);    //定位指針到中間記錄

      $startip=strrev(fread($this->fp,4));         //讀取當前索引區內的開始ip地址,并將其little-endian的字節序轉換成big-endian的字節序

      if ($ip < $startip) {

      $lastip=$i - 1;

      }

      else {

      fseek($this->fp,$this->getoffset());

      $endip=strrev(fread($this->fp,4));

      if ($ip > $endip){

      $firstip=$i + 1;

      }

      else {

      $ip_offset["offset"]=$this->firstip + $i * 7;

      break;

      }

      }

      }

      return $ip_offset;

      }

      /*

      |----------------------------------------------------------------------------

      | 獲取ip地址詳細信息

      |----------------------------------------------------------------------------

      |

      */

      function getaddress($ip){

      $ip_offset=$this->searchip($ip);  //獲取ip 在索引區內的絕對編移地址

      $ipoffset=$ip_offset["offset"];

      $address["ip"]=$ip_offset["ip"];

      fseek($this->fp,$ipoffset);      //定位到索引區

      $address["startip"]=long2ip($this->get4b()); //索引區內的開始ip 地址

      $address_offset=$this->getoffset();            //獲取索引區內ip在ip記錄區內的偏移地址

      fseek($this->fp,$address_offset);            //定位到記錄區內

      $address["endip"]=long2ip($this->get4b());   //記錄區內的結束ip 地址

      $flag=$this->getflag();                      //讀取標志字節

      switch (ord($flag)) {

      case 1:  //地區1地區2都重定向

      $address_offset=$this->getoffset();   //讀取重定向地址

      fseek($this->fp,$address_offset);     //定位指針到重定向的地址

      $flag=$this->getflag();               //讀取標志字節

      switch (ord($flag)) {

      case 2:  //地區1又一次重定向,

      fseek($this->fp,$this->getoffset());

      $address["area1"]=$this->getstr();

      fseek($this->fp,$address_offset+4);      //跳4個字節

      $address["area2"]=$this->readaddress();  //地區2有可能重定向,有可能沒有

      break;

      default: //地區1,地區2都沒有重定向

      fseek($this->fp,$address_offset);        //定位指針到重定向的地址

      $address["area1"]=$this->getstr();

      $address["area2"]=$this->readaddress();

      break;

      }

      break;

      case 2: //地區1重定向 地區2沒有重定向

      $address1_offset=$this->getoffset();   //讀取重定向地址

      fseek($this->fp,$address1_offset);

      $address["area1"]=$this->getstr();

      fseek($this->fp,$address_offset+8);

      $address["area2"]=$this->readaddress();

      break;

      default: //地區1地區2都沒有重定向

      fseek($this->fp,$address_offset+4);

      $address["area1"]=$this->getstr();

      $address["area2"]=$this->readaddress();

      break;

      }

      //*過濾一些無用數據

      if (strpos($address["area1"],"cz88.net")!=false){

      $address["area1"]="未知";

      }

      if (strpos($address["area2"],"cz88.net")!=false){

      $address["area2"]=" ";

      }

      return $address;

      }

      }

      /*用法如下:*/

      $ip=new iplocation("qqwry.dat");

      $address=$ip->getaddress("61.129.51.27");

      //$address=$ip->getaddress(www.jb51.net);

      echo '<pre>';

      print_r($address);

      ?>

    【如何進行PHP查詢ip所在地】相關文章:

    php如何獲得ip地址05-29

    怎么查詢電腦ip地址04-24

    php對特殊語句查詢結果進行數組排序的方法技巧07-01

    PHP對特殊語文查詢結果進行數組排序的方法介紹03-07

    php查詢mysql的實例04-03

    PHP與MYSql連接與查詢06-19

    實現PHP實現限制IP訪問02-23

    PHP獲取真實的客戶IP的方法01-27

    局域網中如何快速查詢有效IP地址03-17

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人