- ベストアンサー
自作のアクセスカウンタ
自分で本を読んで作ったカウンタにIPチェックを付けて多重カウントを防止できるようにしたいんですけどやり方がさっぱりわかりません。プログラムや参考になりそうなURLを教えてください
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
データの保存方法によりますね 例えば一番簡単な、ただ単にカウントを保存している場合だと IPと時間を別ファイルに保存するか、 大幅に書き換えて一緒にするかを選ばなければなりません 時間はtime関数で得られる数字(秒数)を保存しておき現在のと比較することでできます 保存と同時に、それらを過ぎたものを削除していけばいいわけです 以下1つにする場合の例です (ファイルの1行目にカウント数を以下5分以内のデータを保存) $count_file = 'cnt.db'; # 保存するファイル名 $limit = 300; # 制限する秒数 $date = time; $ip = $ENV{REMOTE_ADDR}; $flag = 0; #1行目だけ別にするためのフラグ my(@out,$count,%dowble); open(CNT, "+< $count_file") or open(CNT, ">$count_file"); flock(CNT,2); while(<CNT>) { chomp; unless($flag){ $count = $_; $flag++; next; } my($save_ip,$save_date) = split("\t"); next if(($date - $save_date) > $limit); # 制限する秒数以上は保存しない $dowble{$save_ip}++; # あとで重複を調べる push @out, "$save_ip\t$save_date\n"; # 保存用に配列に入れる } unless($dowble{$ip}){ push @out, "$ip\t$date\n"; $count++; } seek(CNT, 0, 0); print CNT "$count\n"; print CNT @out; truncate(CNT, tell(CNT)); close CNT; わかりやすいように、かなり簡単に書きました(エラー処理とかはしてません) ・ファイルを開いて、制限時間以内のデータを@outに格納 ・@outに現在のIPがないかを確認して、なければ追加 ・そしてカウント数を1行目に ・制限時間以内のデータを次からの行に書き出しています ブラウザなどでカウント数を読み出すときは、このまま、 print $count; で書き出せばいいです もっとたくさんの、データを長期保存している場合でも IPと時間差を比較して保存するかしないかを分岐すればいいと思いますよ
その他の回答 (2)
- cyokokichi
- ベストアンサー率21% (32/152)
私は使ったことがありませんが、 http://www.kent-web.com/count/ecount.html ダウンロードしたperlの125行目からです。 私が見ているのは本についていたCDのものですから内容が変わっているかも知れませんが、IPチェックとコメントが入っていると思います。 利用規約は http://www.kent-web.com/pubc/kitei.html? です。
お礼
回答ありがとうございます 一応KENTさんのページをはじめ色んなところから配布されているスクリプトを集めて見てみたんですが、配布されているのってよくできすぎてて複雑で見ても何をどう処理しているかわからないんですよね……。
- estea
- ベストアンサー率44% (39/87)
多重カウント防止にはいろいろ方法があるとは 思いますが %ENV といった環境変数でIPを調べる アクセス日時とともにファイルに書き込む 何分(時,秒?)毎に再カウントを許可するかを決めて 一定時間以内のアクセスならカウントしない 昔は クッキーを使って実装していましたが最近クッキーをだべてくれないことが多いので・・・。
お礼
回答ありがとうございます 「何分(時,秒?)毎に再カウントを許可するかを決めて 一定時間以内のアクセスならカウントしない」をどうやるか具体的に教えてもらえないでしょうか?
お礼
回答ありがとうございます。 早速本を片手に書いていただいたのを見て勉強したいと思います。時間を比較して保存するかどうかをする方法がわからなかったので簡略な見本を記していただぎとても助かります