ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHPチュートリアルでIPアドレスを実アドレスに変換する方法を詳しく説明

PHP_PHPチュートリアルでIPアドレスを実アドレスに変換する方法を詳しく説明

WBOY
WBOYオリジナル
2016-07-21 15:07:56844ブラウズ

IPv4 アドレスを実際のアドレスに変換したい場合は、IP データベースを参照する必要があります。商用 IP データベースはリレーショナル データベースに保存されており、クエリや使用には非常に便利ですが、コストはそれほど高くありません。企業は喜んで負担するため、無料の IP データベースを使用するか、大規模な Web サイトが提供するクエリ API を使用するのが簡単です。
1. 無害な IP データベースを使用します
ローカルの QQWry.Dat ファイルを使用します。利点は、クエリ速度が非常に速いことです。欠点は、データベース ファイルを独自のスペースに配置する必要があることです。時々更新されます。時間の都合上、これ以上の説明は省略します。このファイルを使用する関数を次に示します。WordPress でこの関数を使用している場合は、テーマの下の function.php に次のコードを記述し、comments-list 他のプログラムによって参照されている場合は、有効な IPv4 アドレスを入力して実際のアドレスを取得します。

コードをコピーします コードは次のとおりです:

function Convertip($ip) {
//IP データ ファイルのパス
$dat_path = 'QQWry.Dat';
//IP アドレスをチェック
//if(!preg_match("/^d{1,3}. d{1,3}.d{1,3}.d{1,3}$/", $ip)) {
// return 'IP アドレス エラー';
//}
// IP データ ファイルを開くF if (! $ Fd = @fopen ($ dat_path, 'rb')) {
Return 'IP Date File Not ExistS or Access Denied';
$ipNum = $ip[0 ] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
//IP データのインデックス開始位置と終了位置を取得
$DataBegin = fread($fd, 4);
$DataEnd = fread($fd, 4);
$ipbegin = implode('', unpack('L', $DataBegin));
if($ipbegin $ipend = implode('', unpack('L', $DataEnd));
if($ipend $ipAllNum = ($ipend - $ ipbegin) / 7 + 1;
$BeginNum = 0;
$EndNum = $ipAllNum;
//二分探索法を使用してインデックスレコードから検索 一致する IP レコード
while($ip1num>$ipNum || $ip2num<$ipNum) {
using using ' s ' 's ' ~ using ' s ' ‐ に一致します。 Byte s Fseek ($ fd, $ ipbegin + 7 * $ middle)
$ ipdata1 = FREAD ($ fd, 4);
if ($ ipdata1) & lt; 4) {
fclose ($ fd);
// 抽出されたデータ変換の増加と整形。 ($ DataSeek) < ; 3) {l fclose ($ fd)
'システムエラー' を返す
$ dataseek = Implode ('', unpack ('l', $ dataseek.chr (0)); ($ fd。
$ipFlag = fread($fd, 1);
if($ipFlag == chr(1)) {
$ipSeek = fread($fd, 3);
if(strlen($ipSeek) < 3) {
fclose($fd);
return 'システムエラー';
}
$ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
fseek($fd,シーク) ;
$ipFlag = fread($fd, 1);
}
if($ipFlag == chr(2)) {
$AddrSeek = fread($fd, 3);
if(strlen($AddrSeek) < 3) {
fclose($fd);
return 'システムエラー';
}
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread( $fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return 'システムエラー';
}
} $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0))
$ipAddr2 .= $char;
$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
fseek($fd, $ AddrSeek);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
} else {
fseek($fd, -1, SEEK_CUR);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
$ipFlag = fread($fd, 1);
if($ipFlag == chr( 2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) <; 3) {
fclose($fd);
return 'システムエラー';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)) );
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) chr(0)){
$ipAddr2 .= $char;
}
}
fclose($fd);
//最後に相应の代替操作後に返结果
if(preg_match('/http/i', $ipAddr2)) {
$ipAddr2 = '';
}
$ipaddr = "$ipAddr1 $ipAddr2";
$ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);
$ipaddr = preg_replace('/^s*/is', '' , $ipaddr);
$ipaddr = preg_replace('/s*$/is', '', $ipaddr);
if(preg_match('/http/i', $ipaddr) || $ipaddr == '' ) {
$ipaddr = 'Unknown';
}
$ipaddr = iconv('gbk', 'utf-8//IGNORE', $ipaddr); //ウェブページの gbk がこの行を削除できる場合はエンコーディングを変換します
return $ipaddr;
}

2. ポータルのインターフェースを使用します
現在、Tencent、Sina、NetEase、Sohu、Google が IP アドレス クエリ API を提供していることが知られていますが、それができるのは Tencent、Sina、NetEase のみです。はい、GoogleはGoogleマップを使っているようなので、まだ調べていません。国内の Tencent サービスをいくつか調べたところ、JavaScript が提供されており、NetEase は XML を提供しており、XML 以外のデータ ソースは JavaScript 呼び出しであるか PHP 呼び出しであるかに関係なく、すべて GBK 形式であることに注意してください。エンコーディングを変換する必要があります。そうしないと、コードが文字化けします。さらに注意が必要なのは、一度に複数の IP をクエリする場合、ポータルの API を使用してクエリを実行すると、PHP を使用して XML を解析するか、file_get_contents() 関数を使用してクエリを取得するかにかかわらず、おそらく for ループを作成して試してみたことです。コンテンツを使用すると、10 回を超えるクエリが非常に遅くなり、タイムアウトになる場合もあります。

Tencent の IP アドレス API インターフェイス アドレス: http://fw.qq.com/ipaddress、返されるデータ形式は次のとおりです: var IPData = new Array("123.124.2.85","","Beijing City"," ") ;、JavaScript オブジェクトですが、IP クエリを入力する方法はまだ不明です。
Sina の IP アドレス クエリ インターフェイス: http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js
Sina のマルチリージョン テスト方法: http://int.dpool.sina.com。 cn/iplookup/iplookup.php?format=js&ip=123.124.2.85
NetEase Youdao の IP アドレス クエリ インターフェイス: http://www.youdao.com/smartresult-xml/search.s?type=ip&q=123.124.2.85
//Tencent APIのPHP呼び出しメソッド
コードをコピー コードは次のとおりです:

function getIpPlace(){
$ip=file_get_contents("http://fw.qq.com/ ipaddress ");
$ip=str_replace('"',' ',$ip);
$ip2=explode("(",$ip);
$a=substr($ip2[1],0,- 2 );
$b=explode(",",$a);
return $b;
}
$ip=getIpPlace();
print_r($ip);

//Youdao API PHP 呼び出しメソッド
コードをコピー コードは次のとおりです:

$url = "http:www.youdao.com/smartresult-xml/search.s?type=ip&q=".$ip;
$doc = new DOMDocument();
$doc->load($url);
$smartresult = $doc->getElementsByTagName("product");
foreach($smartresult as $product)
{
$locations = $ product->getElementsByTagName("location");
$location = $locations->item(0)->nodeValue;
}
if($location != "")
{
echo $i. ".".$ip;
function sinaIPApi($ip){
$str = file_get_contents("http://int.dpool.sina.com.cn/ iplookup/iplookup.php?ip=".$ip) ;
$str = iconv("gbk ", "utf-8//IGNORE", $str);
preg_match_all("/[/x{4e00}-/x{9fa5}]+/u",$str, $get);
$add = implode ('',$get[0]);
Return $add;
}


//$get は素晴らしい 2 次元配列です




その中で、Youdao と Sina は、Tencent API と同様に file_get_contents() 関数を使用してアドレスを取得し、一連の文字列関数を使用してそれを処理することができます。私が作成した関数は正規表現を使用して戻ります。 Sina 結果は中国語の文字を含む文字列を提供し、それをセグメント内の 2 次元配列に格納します。これは Sina の API でのみ役立つ可能性があり、バグが含まれる可能性があります。たとえば、学校から割り当てられた IP アドレスをクエリした後、関数で $get 変数を var_dump() すると、次の結果が得られます。 => 文字列(6) "中国" [1]=> 文字列(6) "北京" [3]=> 文字列(9) [4]=> ; string(6) "school" [5]=> string(18) "中国地質大学" } }、関数の出力結果は「中国地質大学、北京教育ネットワーク学校」です。 、北京、中国」。私のアイデアが他の人にとって役立つ方法と一致していることを願っています。

最後に、もう一度注意していただきたいのですが、WordPress を使用している場合は、最初の方法を使用してください。そうしないと、API を使用してすべてのコメント投稿者の実際のアドレスを同時にクエリすると、PHP がタイムアウトしてしまう可能性があります。表示と表示方法の制限については、すべての専門家がより良い方法を持っています。私を待っている質問はすべて WordPress アプリケーションに関する質問であり、Java と C# についても同様です。これらの質問については、終了後に詳しく説明します。テスト。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327523.html技術記事 IPv4 アドレスを実際のアドレスに変換したい場合は、IP データベースを参照する必要があります。商用 IP データベースはリレーショナル データベースに保存されており、クエリや使用には非常に便利ですが、コストはかかりません。 .
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。