ホームページ  >  記事  >  バックエンド開発  >  PHP を解析して IP に基づいて地域をクエリする (非常に便利、Ganji.com で使用)_PHP チュートリアル

PHP を解析して IP に基づいて地域をクエリする (非常に便利、Ganji.com で使用)_PHP チュートリアル

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

dat ファイル、IP に対応する地域に関する情報ファイル
qqwry.dat ファイル
オンラインで自分でダウンロード

class ファイル、qqwry.data ファイルの
IpLocation.php ファイルを解析

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

class IpLocation {
/**
* @var リソースポインタ
*/
private $fp;
/**
* 最初の IP レコードのオフセット アドレス
* @var int
*/
private $firstip;
/**
* 最後の IP レコードのオフセット アドレス
* @var int
*/
private $最後に;

if (($this->fp = @fopen($filename, 'rb')) !== false) {
;lastip = $this->getlong(); /
public function getlong( ) {
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐ ); 整数
$result = unpack('Vlong', fread($this->fp, 3).chr(0)); */U パブリック関数 Packip ($ IP) ) {
// IP アドレスを長整数に変換します。PHP5 では IP アドレスが間違っている場合は false を返します。
// このとき、FL​​ASE は整数 -1 -1 に変換されます。ビッグエンディアンでエンコードされた文字列に圧縮されます
out out through off 's off 's ' through off through off ‐ ‐ ‐‐‐‐‐ をまとめてビッグエンディアンでエンコードされた文字列に圧縮します
return Pack( 'n'、intval(ip2long($ ip)));
/**
* 地域情報を返す
*
* @access private
* @return string
*/
public function getarea() {
$byte = fread($this->fp, 1); // フラグバイト
switch (ord($byte)) {
case 0 : // エリア情報なし
; ; Break; データファイルが正しく開かれていない場合は、空が直接返されます
$ location['ip'] = gethostbyname($ip); // 入力されたドメイン名を IP アドレスに変換します
$ip = $this->packip($location ['IP']); // 入力された IP を変換しますアドレスを同等の IP アドレスに変換します
// 不正な IP アドレスは 255.255.255.255 に変換されます
// 検索
$ l = 0; // 検索の下限
$u = $this->totalip;検索の上限
$findip = $this->lastip; // $u = $this->totalip; )
While ($ l & lt; = $ u) {//小さい下限よりも低い場合は失敗を見つけます
$ i = Floor (($ l + $ u) / 2); ($this->fp, $this->firstip + $i * 7);
$beginip = strrev (fread($this->fp, 4)); // 中間レコードの開始 IP アドレスを取得します
// Strrev 関数の役割は、リトルエンディアンの圧縮された IP アドレスをビッグエンディアンの形式に変換することです
// 比較のために、同じものは同じです。P IF ($ ip & lt; $ beginip) {// ユーザーの IP が中間レコードの開始 IP アドレスより小さい
$ u = $ i -1 // 中間レコードの検索の上限を次のように変更します。 1 つ減らす} else {
fseek($this->fp, $this->getlong3()); ($ip> s IP は中間の IP 範囲を記録します。
$ Findip = $ this- & gt ; firstip + $ i * 7;
fseek($this->fp,範囲の開始アドレス
use using ‐ using fseek($this->fp, $ offset) through through through through 回避するために off の off を使用するd---- )); // ユーザー IP が存在する範囲の終了アドレス
$byte = fread($this->fp, 1) // フラグバイトバイトは 1 で、次のことを示します。国と地域の情報は同時に
$ CountryOffset = $ This- & GT; // アドレスにリセットされます
fseek ($ this- & gt; fp, $ countryoffset); = FREAD ($ this- & gt; fp, 1); // ロゴバイト
switch (order ($ byte)) {
case 2: // ロゴバイト 2、国家情報が
Fseek にリダイレクトされたことを示す ( $ this->fp, $this->getlong3()); ;
$location['エリア'] $location['country'] = $this->gt; Break;
ケース 2: // フラグ バイトは 2 で、国情報がリダイレクトされることを示します Fseek ($ this-& gt; fp, $ this-& gt; getlong3 ());
$location['area '] = $this->getarea();これ ->getstring($byte);eargy '] == "cz88.net"){$ location' if($> fp){


実行ファイル、ここでは ip_location.php ファイルを呼び出します




コードをコピーします

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


function getIpPlace(){
require_once("IpLocation.php" )//クラス File IpLocation.php
をロード $ipfile = "qqwry.dat"; //ip に対応する領域の情報ファイルを取得します $iplocation = new IpLocation($ipfile); //new IpLocation($ipfile); ) $ipfile ip に対応するリージョンの情報ファイル
$ipresult = $iplocation->getlocation("ip address"); //ip アドレスに基づいてリージョンを取得 getlocation("ip リージョン") return $ ipresult;
}
print_r($getIpPlace()); // メソッドを呼び出す
?>




http://www.bkjia.com/PHPjc/327963.html
www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327963.html
技術記事

dat ファイル、IP の対応する領域に関する情報ファイル qqwry.dat ファイルをオンラインでダウンロードし、qqwry.data ファイルの IpLocation.php ファイルを解析します: ?php cl...





声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。