ホームページ >バックエンド開発 >PHPチュートリアル >独自のバイナリ IP ライブラリ ファイルを作成する_PHP チュートリアル

独自のバイナリ IP ライブラリ ファイルを作成する_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:14:141227ブラウズ

1.

IP アドレス クエリ機能を使用したことがある友人なら、Innocence IP データベースについて聞いたことがあるはずです。Innocence IP データベース クエリは次のようなものです。

IPに基づいてユーザーのホームテキストを検索して表示するだけの場合は、IPライブラリのルールに従って二分検索を実行して表示するだけです。 (フォーマット詳細説明)

しかし、IP に基づいて場所のテキスト説明を取得し、それを既存の行政区域データ テーブルにさらに関連付ける必要がある場合はどうすればよいでしょうか?

一見するとどちらも可能なはずですが、効率はどうでしょうか?ひどい!特に、同時実行性がわずかに高いアプリケーションに直面すると、これらの方法はいずれもテストに耐えることができません。

Innocence IP ライブラリ (他の IP ライブラリも可) のデータを独自の領域データに関連付け、Innocence IP ライブラリの領域記述を独自の領域 ID に置き換えて、最終的に独自のバイナリ IP ライブラリ ファイルを作成してみてはいかがでしょうか?

本題に入り、純粋な IP ライブラリ データに基づいて独自のバイナリ IP ライブラリ ファイルを作成する方法を見てみましょう。

注: この記事では一般的なアイデアのみを説明しており、詳細なコードはありません。ありがとうございます

2.準備

データの 2 つの部分を準備する必要があります:

1. Innocence IP ライブラリの解凍された txt ファイル。

Innocence IP ライブラリをダウンロードすると、ip.exe ツールがあり、上記の解凍を使用して生成できます。

生成されたデータは図1-1に示すとおりで、私のバージョンでは約444,290のエントリがあります。

図1-1

2. 独自の国、州、市のカスケード データ テーブル。

これはインターネット上にもっとあるはずです。自分でインポートすることもできます。テーブル構造は同様です(area_id、area_level、area_name、area_pid)。それぞれエリアID、エリアレベル、エリア名、親エリアIDを表します。

もちろん、自分で別の構造を使用することもできますが、今回の処理には影響しません。

3.プロセス

データはすでに利用可能です。次に、生成する必要がある IP ライブラリの構成を計画しましょう。

タイトルからわかるように、生成する必要がある IP ライブラリは通常のテキスト ファイルではなく、バイナリ データ パケットです。では、IP ライブラリのファイル構造はどうあるべきでしょうか。

写真の通り:

私たちの構造は次のようであることがわかります:

    頭。ファイルの最初の 8 バイトにあります。最初の 4 バイトは 32 ビット整数を格納し、その値はファイル内のデータ部分の先頭の位置です。最後の 4 バイトも 32 ビット整数を格納し、その値はファイルの末尾の位置です。ファイル内のデータ部分
    • 件名データ部分。 N 個の固定構造体で構成され、各構造体は 12 バイトであり、IP 範囲データ (ip_start、ip_end、area_code) です。構造体の 3 つの部分も、それぞれ 4 バイトの 32 ビット符号付き整数です。 (エリアコードが小さい場合は1文字でも可)

IPデータパケットの構造が決定されたので、次のステップはそれを段階的に処理することです。

1. IP テキスト ファイルの内容を 1 つずつ読み取り、IP を 32 ビットの符号付き整数 (カスタマイズされた ip2long) に変換し、地域テキスト分析を通じて最終的な領域を取得します

a. IP テキスト ファイルの各行の規則は、最初の 15 バイトが IP 開始アドレス、最後の 15 バイトが IP 終了アドレス、最後が地域テキストの説明です。

b. IP を 32 ビットの符号付き整数に変換するのは 4 バイトだけであり、

PHP 関数 ip2long が 32 ビット システムと 64 ビット システムで異なる値を持つという問題が解決されます。新しい関数は次のとおりです。

リーリー もちろん、独自の PHP 拡張機能を開発することもできます。詳細については、こちらを参照してください: http://www.cnblogs.com/iblaze/archive/2013/06/02/3112603.html

c. 図に示すように、地域はすべてのレベルで地域の名前を取得する必要があります (州、市、郡、地区などを含みます。外国では国のみが保持されます)。

2.取得したリージョン情報をリージョンIDに変換します

誰もが異なるリージョンを使用する可能性があるため、プロセスのこの部分をうまく説明できませんが、一般原則としては、まず最下位レベルのリージョン名に基づいて ID を見つけることです (実際の状況によっては、都市と郡) クラスを削除します)、そうでない場合は、上位レベルを検索し、地域 ID が取得されるまでこのようにループします。

リージョンIDが見つからない場合は不明として分類されます。

3. 圧縮、圧縮ファイルは約5.08Mです

圧縮ルールは図の通りです。formatの値はpack:

のtypeに対応します。

ここで注意しなければならない点があり、IPは符号付き32ビット整数に変換されるため、128.0.0.0以降のIPは負の数となるため、負の数を判断してIPライブラリの前に置く必要があります。結局のところ、二分探索を使用するには順序付けされたデータが必要です。

4. IP を見つけるには、次のような 44W のデータを最大 19 回検索するだけで済みます。


4. シングルテスト、速度は問題ないようです

5効果を確認する簡単な圧力テスト

a. 腹圧テストには、このマシンの腹筋を使用します

b. テストスクリプトはLinuxテストマシン(普通のPC)上にあります

c. ストレステストのスクリプトは次のとおりです。

d. ストレステストステートメント: ab -n 10000 -c 50 http://192.168.206.71/ipdata.php?type=php

パフォーマンスはかなり良いです。はは

一緒に話し合える良い方法はありますか? ありがとうございます〜

http://www.bkjia.com/PHPjc/440306.html

www.bkjia.com

http://www.bkjia.com/PHPjc/440306.html技術記事 1. はじめに IP アドレス クエリ機能を使用したことのある友人なら、Innocence IP ライブラリについて聞いたことがあるはずです。Innocence IP データベース クエリは次のようになります。IP に基づいてユーザーのアドレス テキストを検索する必要がある場合のみです。 .
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。