ホームページ > バックエンド開発 > PHPチュートリアル > php_PHP チュートリアルで IP の場所をクエリする方法

php_PHP チュートリアルで IP の場所をクエリする方法

WBOY
リリース: 2016-07-13 10:12:18
オリジナル
1004 人が閲覧しました

phpでIPの位置を問い合わせる方法

具体的な実装方法は以下の通りです:

コードは次のとおりです:

/**
*@日付 2010.12.21
注: ファイルヘッダー [最初のインデックスのオフセット (4 バイト)] + [最後のインデックスのオフセットアドレス (4 バイト)] 8 バイト
記録領域 [終了IP(4byte)] + [リージョン1] + [リージョン2]地域 1 インデックス領域 [開始 IP (4 バイト)] + [レコード領域を指すオフセット アドレス (3 バイト)] 7 バイト
*/
クラス IP ロケーション{
変数$fp; var $firstip; //最初の IP インデックスのオフセット アドレス
var $lastip; //最後の IP インデックスのオフセット アドレス
var $totalip; //合計 IP 数
/*
|------------------------------------------------- ------------------------
| コンストラクター、いくつかの変数を初期化します
|------------------------------------------------- ------------------------
|
*/
関数 iplocation($datfile = "qqwry.dat"){
$this->fp=fopen($datfile,'rb')or die("qqwry.dat が存在しません。オンラインにしてくださいInnocence IP データベース、'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 ライブラリを閉じる
|------------------------------------------------- ------------------------
|
*/
関数 closefp(){
fclose($this->fp); }
/*
|------------------------------------------------- ------------------------
| 4バイトを読み取り、ロングモードに解凍します
|------------------------------------------------- ------------------------
|
*/
関数 get4b(){
$str=unpack("v",fread($this->fp,4)); $str[1] を返します。 }
/*
|------------------------------------------------- ------------------------
| リダイレクトされたオフセットアドレスを読み取ります
|------------------------------------------------- ------------------------
|
*/
関数 getoffset(){
$str=unpack("v",fread($this->fp,3).chr(0)); $str[1] を返します。 }
/*
|------------------------------------------------- ------------------------
| IP の詳細なアドレス情報を読む
|------------------------------------------------- ------------------------
|
*/
関数 getstr(){
$split=fread($this->fp,1); while (ord($split)!=0) {
$str .=$split
$split=fread($this->fp,1); }
$str を返します。 }
/*
|------------------------------------------------- ------------------------
| ip2long を介して IP を IPv4 インターネット アドレスに変換し、インデックス領域の IP アドレスと比較するためにビッグエンディアンのバイト オーダーに圧縮します
|------------------------------------------------- ------------------------
|
*/
関数 iptoint($ip){
return Pack("n",intval(ip2long($ip))); }
/*
|------------------------------------------------- ------------------------
| 住所情報を取得する
|------------------------------------------------- ------------------------
|
*/
関数 readaddress(){
$now_offset=ftell($this->fp); //現在のポインタアドレスを取得します
$flag=$this->getflag(); スイッチ (ord($flag)){
ケース 0:
$アドレス=""; 休憩
ケース 1:
ケース 2:
fseek($this->fp,$this->getoffset()); $address=$this->getstr(); 休憩
デフォルト:
fseek($this->fp,$now_offset); $address=$this->getstr(); 休憩
}
$アドレスを返します
}
/*
|------------------------------------------------- ------------------------
| フラグ 1 または 2 を取得して、アドレスがリダイレクトされるかどうかを決定します
|------------------------------------------------- ------------------------
|
*/
関数 getflag(){
fread($this->fp,1)を返す
}
/*
|------------------------------------------------- ------------------------
| 二分探索法を使用してインデックス領域の IP を検索します
|------------------------------------------------- ------------------------
|
*/
関数 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 $i=floor(($firstip + $lastip) / 2); //近似中間レコードを計算する Floor関数は、端的に言えば、四捨五入を意味します
。 fseek($this->fp,$this->firstip + $i * 7); // 中央のレコードへのポインターを見つけます
$startip=strrev(fread($this->fp,4)); //現在のインデックス領域の開始 IP アドレスを読み取り、そのリトルエンディアンのバイトオーダーをビッグエンディアンのバイトオーダーに変換します
if ($ip $lastip=$i - 1; }
他 {
fseek($this->fp,$this->getoffset()); $endip=strrev(fread($this->fp,4)); if ($ip > $endip){
$firstip=$i + 1; }
他 {
$ip_offset["オフセット"]=$this->firstip + $i * 7; 休憩
}
}
}
$ip_offset を返します
}
/*
|------------------------------------------------- ------------------------
| IP アドレスの詳細を取得します
|------------------------------------------------- ------------------------
|
*/
関数 getaddress($ip){
$ip_offset=$this->searchip($ip); //インデックス領域のIPの絶対オフセットアドレスを取得します
$ipoffset=$ip_offset["オフセット"]; $アドレス["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(); スイッチ (ord($flag)) {
case 1: //リージョン 1 とリージョン 2 がリダイレクトされます
$address_offset=$this->getoffset() //リダイレクトアドレスを読み取ります
; fseek($this->fp,$address_offset); //リダイレクトされたアドレスへのポインターを見つけます
$flag=$this->getflag(); //フラグバイトを読み取る
スイッチ (ord($flag)) {
ケース 2: //リージョン 1 が再びリダイレクトされます
fseek($this->fp,$this->getoffset()); $address["area1"]=$this->getstr(); fseek($this->fp,$address_offset+4); // 4 バイトジャンプ
$address["area2"]=$this->readaddress(); //エリア 2 はリダイレクトされる可能性がありますが、リダイレクトされない可能性があります
休憩
デフォルト: //リージョン 1 とリージョン 2 にはリダイレクトがありません
fseek($this->fp,$address_offset); //リダイレクトされたアドレスへのポインターを見つけます
$address["area1"]=$this->getstr();
$address["area2"]=$this->readaddress(); 休憩
}
休憩
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(); 休憩
デフォルト: //リージョン 1 とリージョン 2 にはリダイレクトはありません
fseek($this->fp,$address_offset+4); $address["area1"]=$this->getstr();
$address["area2"]=$this->readaddress();休憩
}
//*無駄なデータをフィルタリングします
if (strpos($address["area1"],"cz88.net")!=false){
$address["area1"]="不明"; }
if (strpos($address["area2"],"cz88.net")!=false){
$アドレス["エリア2"]=" "; }
$アドレスを返します
}
}

/*使用方法は次のとおりです:*/
$ip=新しいiplocation("qqwry.dat"); $address=$ip->getaddress("61.129.51.27"); //$address=$ip->getaddress(www.jb51.net); エコー '
';
print_r($アドレス);
?>





http://www.bkjia.com/PHPjc/922886.html
www.bkjia.comtru​​e

http://www.bkjia.com/PHPjc/922886.html技術記事 IP アドレスをクエリする PHP の具体的な実装方法は次のとおりです。 コードは次のとおりです。 ?php /** *@ date 2010.12.21 注: ファイル ヘッダー [最初のインデックスのオフセット (4byte)] + [インデックスのオフセット (4byte)]最後のインデックス ...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート