99.7.アクセスカウンタ(count)
画像合成式アクセスカウンタです。
参考<http://w3.lab.kdd.co.jp/technotes/WWW/CGI/gifonfly.html>
ユーザレベルのURLでカウント制限します。他ページからの不正利用を防止します。
99.7.1.主な特徴
open(IN,"count.txt"); $x = <IN>; close(IN); $x++; open(IN,">count.txt"); flock(IN,2); #排他 print IN "$x\n"; close(IN);
でクリアされるので,flockが効かないとかアテにならないとかいう記述を目にします。
これは,flockが働かないのではなく,スクリプトに原因が有ることは一目瞭然です。
およそ,プログラムは上から順に処理するので
open(IN,"count.txt"); $x = <IN>; close(IN); $x++; open(IN,">count.txt");
の所まで見れば,明らかに自分でゼロクリアしているわけです。
このとき他人がファイルを読めば,ゼロを引き継いでしまうわけです。
出力命令はバッファ上で行うわけではなく物理的に更新するので,一瞬の機械的動作によるCPU空き時間が命取りになるわけです。
クリアしてから排他しても手遅れなのです。サーバの負荷が増えれば危険性が高まるでしょう。
99.7.2.カウントファイルのレコードレイアウト
n(改行:LF) nは数値です 0(LF)
最初は空(size=0)のファイルでもOKです。最後の改行は,有っても無くても良い。
99.7.3.制限事項
count.txt アクセスカウンタ count.pl
をダウンロード後に,自分の環境に合わせて修正して下さい。
主な修正箇所はカウントするURL,flyのパス,画像の設定,カウントファイルのパスなどです。
$base = 'http://www.hogehoge.(or|ne).jp/~foo/'; #カウントする対象の最上位URL $fly = './fly'; #flyのパス $img = './gif'; #桁画像が有るパス $dgx = 15; $dgy = 20; #一桁あたりの画像の幅と高さ(ピクセル単位) #この場合は15x20ピクセル $file = "$link\.txt"; #カウントファイルのパス
修正したスクリプトと各ファイルをftpで/home/foo/(任意)ディレクトリへ転送します
kibita(*)cd /home/foo
kibita(*)put count.txt count.cgi
kibita(*)quote site chmod 705 count.cgi
kibita(*)put xxx.txt
kibita(*)quote site chmod 604 xxx.txt
kibita(*)cd /home/foo/gif
kibita(*)binary
kibita(*)put 0.gif
kibita(*)put 9.gif
kibita(*)put warn.gif
例の場合,画像は以下のように入っています。
0.gif〜9.gifの大きさは全て同じにしてください。
/home/foo/gif/0.gif
/home/foo/gif/1.gif
/home/foo/gif/2.gif
/home/foo/gif/3.gif
/home/foo/gif/4.gif
/home/foo/gif/5.gif
/home/foo/gif/6.gif
/home/foo/gif/7.gif
/home/foo/gif/8.gif
/home/foo/gif/9.gif
/home/foo/gif/warn.gif
99.7.6.使用例
width(省略可):表示する桁数
increment(省略可):増分値
link(必須):link=xxx,xxxは任意の文字列=カウントファイル名xxx.txtです。
Copyright (c)1997 GOMASUKE
Since 06/12/1997, Last Updated 06/12/1997