IPに基づいてユーザーのホームテキストを検索して表示するだけの場合は、IPライブラリのルールに従って二分検索を実行して表示するだけです。 (フォーマット詳細説明)
しかし、IP に基づいて場所のテキスト説明を取得し、それを既存の行政区域データ テーブルにさらに関連付ける必要がある場合はどうすればよいでしょうか?
一見するとどちらも可能なはずですが、効率はどうでしょうか?ひどい!特に、同時実行性がわずかに高いアプリケーションに直面すると、これらの方法はいずれもテストに耐えることができません。
Innocence IP ライブラリ (他の IP ライブラリも可) のデータを独自の領域データに関連付け、Innocence IP ライブラリの領域記述を独自の領域 ID に置き換えて、最終的に独自のバイナリ IP ライブラリ ファイルを作成してみてはいかがでしょうか?
本題に入り、純粋な IP ライブラリ データに基づいて独自のバイナリ IP ライブラリ ファイルを作成する方法を見てみましょう。
注: この記事では一般的なアイデアのみを説明しており、詳細なコードはありません。ありがとうございます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データパケットの構造が決定されたので、次のステップはそれを段階的に処理することです。
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 回検索するだけで済みます。
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