ホームページ  >  記事  >  バックエンド開発  >  IP 地理的位置クエリ クラスを再度提供する

IP 地理的位置クエリ クラスを再度提供する

WBOY
WBOYオリジナル
2016-07-25 09:11:201018ブラウズ
IP 地理的位置クエリ クラス
  1. /**
  2. ファイル名: IpLocation.class.php
  3. * IP 地理的位置クエリ クラス (メイン ファイルとテスト ファイルをアップロードしました。QQWry.Dat もあります。これは、Innocence IP ライブラリからダウンロードできます。6M を超えているため、ここにはアップロードしません)
  4. *
  5. * @author Ma Bingyao
  6. * @version 1.5
  7. * @copyright 2005 CoolCode.CN
  8. */
  9. class IpLocation {
  10. /**
  11. * QQWry.Dat ファイルポインタ
  12. * @var リソース
  13. */
  14. var $fp
  15. /**
  16. * 最初の IP レコードのオフセット アドレス
  17. * @var int
  18. */
  19. var $firstip; ;
  20. /**
  21. * 最後の IP レコードのオフセット アドレス
  22. * @var int
  23. */
  24. var $lastip;
  25. /**
  26. * IPレコードの総数(バージョン情報レコードを除く)
  27. * @var int
  28. */
  29. var $totalip;
  30. function __construct($filename = " .Dat") {
  31. $this->fp = 0;
  32. if (($this->fp = @fopen($filename, 'rb')) !== false) {
  33. $this->firstip = $this->getlong();
  34. $this->lastip = $this->getlong();
  35. $this->totalip = ($this->lastip - $this->firstip) / 7;
  36. //プログラム実行の最後に実行されるようにデストラクターを登録します
  37. register_shutdown_function(array(&$this, '__construct'));
  38. /**
  39. * コンストラクター、QQWry.Dat ファイルを開き、クラス内の情報を初期化します
  40. * @param string $filename
  41. * @return IpLocation
  42. */
  43. function getlong() {
  44. //読み取った 4 バイトのリトルエンディアンエンコーディングを long 整数に変換します
  45. $result = unpack('Vlong', fread($this->fp, 4));
  46. return $result[ 'long'];
  47. }
  48. /**
  49. * 読み込んだ長整数を返します
  50. * @access private
  51. * @return int
  52. */
  53. function getlong3() {
  54. //読み取った 3 バイトのリトルエンディアンエンコーディングを long 整数に変換します
  55. $result = unpack('Vlong', fread($this->fp, 3).chr(0));
  56. return $result['long'];
  57. /**
  58. * 読み取った 3 バイト長整数を返します
  59. *
  60. * @access private
  61. * @return int
  62. */
  63. function package($ip) {
  64. / / PHP5ではIPアドレスをlong型の整数に変換します
  65. // このとき、intvalはFleseを整数-1に変換してからビッグエンディアンに圧縮します。エンコードされた文字列
  66. return Pack('N', intval(ip2long($ip)));
  67. }
  68. /**
  69. * 比較可能な圧縮された IP アドレスを返します
  70. *
  71. * @access private
  72. * @param string $ip
  73. * @return string
  74. */
  75. function getstring($data = "") {
  76. $ char = fread($ this->fp, 1);
  77. while (ord($char) > 0) { // 文字列は C 形式で保存されます。
  78. if ($ip < $beginip) { // ユーザーの IP が中間レコードの開始 IP アドレスより小さい場合
  79. $u = $i - 1; // 検索の上限を中間レコードに変更します。マイナス 1
  80. } else {
  81. fseek($this->fp, $this->getlong3());
  82. $endip = strrev(fread($this->fp, 4)); // 終了を取得中間レコードの IP アドレス
  83. if ($ip > $endip) { // ユーザーの IP が中間レコードの終了 IP アドレスより大きい場合
  84. $l = $i + 1; // の下限を変更します。中間レコードに 1 を加えたものを検索します
  85. } else { // ユーザーの IP が中間レコードの IP 範囲内にある場合
  86. $findip = $this->firstip + $i * 7; // これは意味します。結果が見つかり、ループが終了します
  87. }
  88. }
  89. }
  90. //見つかった IP 地理的位置情報を取得します
  91. fseek($this->fp, $findip)
  92. $location['beginip'] = long2ip ($this->getlong()); // ユーザー IP が存在する範囲の先頭
  93. $offset = $this->getlong3();
  94. fseek($this->fp, $offset );
  95. $location['endip'] = long2ip($this->getlong()) / / ユーザー IP 範囲の終了アドレス
  96. $byte = fread($this->fp, 1); Flag byte
  97. switch (ord($byte)) {
  98. case 1: // フラグ バイトは 1 で、国と地域の情報が同時にリダイレクトされることを示します
  99. $countryOffset = $this->getlong3() / / リダイレクトアドレス
  100. fseek($this->fp, $countryOffset);
  101. $byte = fread($ this->fp, 1); // フラグバイト
  102. switch (ord($byte)) {
  103. case 2 : // フラグバイトは 2 で、国情報が再度リダイレクトされたことを示します
  104. fseek($this-> ;fp, $this->getlong3()); $location['country'] = $this-> ;getstring();
  105. fseek($this->fp, $countryOffset + 4);
  106. $location ['area'] = $this->getarea();
  107. デフォルト: //国情報がリダイレクトされないことを意味します
  108. $location['country'] = $this->getstring($byte );
  109. $location['area'] = $this->getarea(); }
  110. Break;
  111. case 2: // フラグバイトは 2 で、国情報がリダイレクトされることを示します
  112. $location['country' ] = $this->getstring();
  113. fseek($this->fp, $offset + 8);
  114. $location['area'] = $this->getarea();
  115. デフォルト: // それ以外の場合は、国情報がリダイレクトされないことを意味します
  116. $location['country'] = $this->getstring ($byte);
  117. $location['area'] = $this->getarea( );
  118. Break;
  119. }
  120. if ($location['country'] == " CZ88.NET") { // CZ88 .NET は有効な情報がないことを示します
  121. $location['country'] = "Unknown" ;
  122. }
  123. if ($location['エリア'] == " CZ88.NET") {
  124. $location['エリア'] = " ";
  125. }
  126. $location; &*/
  127. function __desctruct() {
  128. if ($this->fp) {
  129. fclose($this->fp)
  130. }
  131. $this->fp = 0;
  132. }
  133. ?> ;
  134. コードをコピー
  135. require_once('IpLocation.class.php');
  136. $ip='127.0.0.1';
  137. $idADDR=new IpLocation()
  138. print_r($idADDR->getlocation($) ip));
  139. ?>
コードをコピー
  1. /**
  2. * IP 地理的位置クエリ クラス
  3. *
  4. * @author Ma Bingyao
  5. * @version 1.5
  6. * @copyright 2005 CoolCode.CN
  7. */
  8. class IpLocation {
  9. /**
  10. * QQWry.Dat ファイルポインタ
  11. * @var リソース
  12. */
  13. var $fp
  14. /**
  15. * 最初の IP レコードのオフセット アドレス
  16. * @var int
  17. */
  18. var $firstip; ;
  19. /**
  20. * 最後の IP レコードのオフセット アドレス
  21. * @var int
  22. */
  23. var $lastip;
  24. /**
  25. * IPレコードの総数(バージョン情報レコードを除く)
  26. * @var int
  27. */
  28. var $totalip;
  29. function __construct($filename = " .Dat") {
  30. $this->fp = 0;
  31. if (($this->fp = @fopen($filename, 'rb')) !== false) {
  32. $this->firstip = $this->getlong();
  33. $this->lastip = $this->getlong();
  34. $this->totalip = ($this->lastip - $this->firstip) / 7;
  35. //プログラム実行の最後に実行されるようにデストラクターを登録します
  36. register_shutdown_function(array(&$this, '__construct'));
  37. /**
  38. * コンストラクター、QQWry.Dat ファイルを開き、クラス内の情報を初期化します
  39. * @param string $filename
  40. * @return IpLocation
  41. */
  42. function getlong() {
  43. //読み取った 4 バイトのリトルエンディアンエンコーディングを long 整数に変換します
  44. $result = unpack('Vlong', fread($this->fp, 4));
  45. return $result[ 'long'];
  46. }
  47. /**
  48. * 読み取った長整数を返します
  49. * @access private
  50. * @return int
  51. */
  52. function getlong3() {
  53. //読み取った 3 バイトのリトルエンディアンエンコーディングを long 整数に変換します
  54. $result = unpack('Vlong', fread($this->fp, 3).chr(0));
  55. return $result['long'];
  56. /**
  57. * 読み取った 3 バイト長整数を返します
  58. *
  59. * @access private
  60. * @return int
  61. */
  62. function package($ip) {
  63. / / PHP5ではIPアドレスをlong型の整数に変換します
  64. // このとき、intvalはFleseを整数-1に変換してからビッグエンディアンに圧縮します。エンコードされた文字列
  65. return Pack('N', intval(ip2long($ip)));
  66. }
  67. /**
  68. * 比較可能な圧縮された IP アドレスを返します
  69. *
  70. * @access private
  71. * @param string $ip
  72. * @return string
  73. */
  74. function getstring($data = "") {
  75. $ char = fread($ this->fp, 1);
  76. while (ord($char) > 0) { // 文字列は C 形式で保存されます。
  77. if ($ip < $beginip) { // ユーザーの IP が中間レコードの開始 IP アドレスより小さい場合
  78. $u = $i - 1; // 検索の上限を中間レコードに変更します。マイナス 1
  79. } else {
  80. fseek($this->fp, $this->getlong3());
  81. $endip = strrev(fread($this->fp, 4)); // 終了を取得中間レコードの IP アドレス
  82. if ($ip > $endip) { // ユーザーの IP が中間レコードの終了 IP アドレスより大きい場合
  83. $l = $i + 1; // の下限を変更します。中間レコードに 1 を加えたものを検索します
  84. } else { // ユーザーの IP が中間レコードの IP 範囲内にある場合
  85. $findip = $this->firstip + $i * 7; // これは意味します。結果が見つかり、ループが終了します
  86. }
  87. }
  88. }
  89. //見つかった IP 地理的位置情報を取得します
  90. fseek($this->fp, $findip)
  91. $location['beginip'] = long2ip ($this->getlong()); // ユーザー IP が存在する範囲の先頭
  92. $offset = $this->getlong3();
  93. fseek($this->fp, $offset );
  94. $location['endip'] = long2ip($this->getlong()) / / ユーザー IP 範囲の終了アドレス
  95. $byte = fread($this->fp, 1); Flag byte
  96. switch (ord($byte)) {
  97. case 1: // フラグ バイトは 1 で、国と地域の情報が同時にリダイレクトされることを示します
  98. $countryOffset = $this->getlong3() / / リダイレクトアドレス
  99. fseek($this->fp, $countryOffset);
  100. $byte = fread($ this->fp, 1); // フラグバイト
  101. switch (ord($byte)) {
  102. case 2 : // フラグバイトは 2 で、国情報が再度リダイレクトされたことを示します
  103. fseek($this-> ;fp, $this->getlong3()); $location['country'] = $this-> ;getstring();
  104. fseek($this->fp, $countryOffset + 4);
  105. $location ['area'] = $this->getarea();
  106. デフォルト: //国情報がリダイレクトされないことを意味します
  107. $location['country'] = $this->getstring($byte );
  108. $location['area'] = $this->getarea(); }
  109. Break;
  110. case 2: // フラグバイトは 2 で、国情報がリダイレクトされることを示します
  111. $location['country' ] = $this->getstring();
  112. fseek($this->fp, $offset + 8);
  113. $location['area'] = $this->getarea();
  114. デフォルト: // それ以外の場合は、国情報がリダイレクトされないことを意味します
  115. $location['country'] = $this->getstring ($byte);
  116. $location['area'] = $this->getarea( );
  117. Break;
  118. }
  119. if ($location['country'] == " CZ88.NET") { // CZ88 .NET は有効な情報がないことを示します
  120. $location['country'] = "Unknown" ;
  121. }
  122. if ($location['エリア'] == " CZ88.NET") {
  123. $location['エリア'] = " ";
  124. }
  125. $location; &*/
  126. function __desctruct() {
  127. if ($this->fp) {
  128. fclose($this->fp)
  129. }
  130. $this->fp = 0;
  131. }
  132. ?> ;
  133. コードをコピー
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。