gethostbyaddrのキャッシュ化

category-icon

 こんばんは、martinです。前回に引き続いて、高速化のお話。

 ppBlogは、それなりに高機能だと思っているアクセス解析機能が初めから付いていますが、ログ取得のためにアクセス時のIPアドレスから、PHPのgethostbyaddr()Link 関数を使ってホスト名を取得できれば取得するようにしています。gethostbyaddr()関数はDNSサーバに問い合わせてIPアドレスに対応するホスト名を調べる、いわゆる逆引きを行ってくれます。なので、ともすると、この段階がページ表示スピードのボトルネックになる可能性があります。

 なので、IPアドレスに対応するホスト名のキャッシュ化を考えてみました。情報をどこに保持するかですが、ひとつのIPアドレスに対して、ひとつの対応するホスト名さえ分かればOKなので、ここはクッキーに情報を保持するのが良さそうです。その際に、「生」の値を保持するのは、何となく気持ち悪いので暗号化してクッキーに保持するようにします。

 アクセス解析のための情報取得は、stat/log.phpが担当してるのですが、ここ1-2日間、log.phpを結構書き換えています。IPアドレス/ホスト名のクッキー化に関する記述は、今のところ以下のような感じです。

/*
 * gethostbyaddrのキャッシュ化による高速化。クッキーによる実装。
 * 暗号化されたホスト情報がクッキーに入ってるなら、それを取得。そうでなければ逆引きをする。
*/
if(isset($_COOKIE['PPBLOG_DNS']) && strpos(($DNS = ' '.my_decrypt($_COOKIE['PPBLOG_DNS'])), $ip)){
  list($host,) = explode("¥t", ltrim($DNS), 2); // ホスト名の取得。gethostbyaddr()関数よりずっと高速。
}

if(!isset($host)){ // クッキーに記録されていなければ、そこで初めてgethostbyaddr()関数を使う
 $host = ($host = gethostbyaddr($ip)) ? $host : $ip;
 if($host != '') setcookie('PPBLOG_DNS', my_encrypt("$host¥t$ip"), time() + 30*24*3600);
}

 gethostbyaddr()関数と比べて、どれくらい速いか計測したところ、少なくとも40倍以上高速になりました。この実装で問題がないようであれば、次期バージョンアップ時に採用したいと思っていますが、試してみたいという方のために添付しておきます。単なる上書きで良いです。その際、元のlog.phpのバックアップは取っておいて下さい。

添付ファイル: log.phpattachedIcon 

— posted by martin at 04:18 am   commentComment [8]  pingTrackBack [0]

この記事に対するコメント・トラックバック [8件]

scrollUp1. ぷらむ — 2009/07/05@07:59:29

log.phpは、統計アカウント除外がされない件もあってVer1.7のものを使っています。
このlog.phpを使ってみたら、googlebot.comがログに表示されますね。前はカウンターには含まれたが表示はされなかった。今度は表示までされますね。したがってまたVer1.7に戻します。

Owner Comment martin Website  2009/07/05@12:39:50

こんばんは。現状では、仕様です。googlebot.comのログが不要であれば、添付のlog.phpの81行目の下に、

if(strpos($ua, 'rawl') || strpos($ua, 'aidu') || strpos($ua, 'bot') || strpos($ua, 'Bot') || strpos($ua, 'lurp')) $ip_accept = FALSE;
if(strpos($ua, '; SV1') || strpos($ua, 'ScoutJet')) $ip_accept = FALSE;

あたりを追加すると良いです。自分は、その手のbotのログは不要なので、そうしています。
 この辺は、設定で指定出来るようにしようかなぁ、と思案中です。

3. 初心者 — 2009/07/05@08:55:46

初歩的な質問ですみませんが、
今日、昨日のアクセス数を4桁表示にするには、どうすればよろしいでしょうか。

Owner Comment martin Website  2009/07/05@12:43:44

こんばんは。log.phpのバージョンにもよりますが、添付のやつであれば、17行目の

$displen = 5; // トータル数の桁数を設定

の数字を7に変えれば、4桁になるかと思います。ここを変えると、トータル数の桁数が7桁表示になりますが、昨日・今日の部分で4桁必要なアクセス数なら、7桁でもよいかなという考えです。

5. 初心者 — 2009/07/05@13:39:38

早速のご回答ありがとうございました。

トータルアクセス7桁にはまだまだですが、
末永くよろしくお願い致します:D

scrollUp6. ぷらむ — 2009/07/05@18:14:56

81行以下、挿入しました。
>この辺は、設定で指定出来るようにしようかなぁ、と思案中です。
Ver1.7時代は、入っていたので、是非入れて下さい。

7. ぷらむ — 2009/07/05@19:35:13

81行以下、挿入すると、ログにgooglebot.comは表示されなくなるが、カウンターはそのまま残るので、飛び飛びでカウンターの数が増えていきますね。またver1.7に戻す。

Owner Comment martin Website  2009/07/05@23:40:23

カウンターが飛び飛びなのは仕様です。飛び飛びな部分は、IPで弾いたか、このように、直接botなどの文字列が含まれていたので記録しなかったということですから。考えとしては、アクセスの足跡は記録するけど、わざわざログに残してログの肥大化を招きたくないというのがあります。この辺りは、お好みなのでv1.7でも構わないと思います。パフォーマンスは、明らかに新しいのがベターですが。

この記事に対する TrackBack URL:

設定によりTB元のページに、こちらの記事への言及(この記事へのリンク)がなければ、TB受付不可となりますのであらかじめご了承下さい。

コメントをどうぞ。 名前(ペンネーム)と画像認証のひらがな4文字は必須で、ウェブサイトURLはオプションです。

ウェブサイト (U):

タグは使えません。http://・・・ は自動的にリンク表示となります

:) :D 8-) ;-) :P :E :o :( (TT) ):T (--) (++!) ?;w) (-o-) (**!) ;v) f(--; :B l_P~

     
T: Y: ALL: Online:
Created in 0.0161 sec.
prev
2021.9
next
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30