99章.お役立ちperlプログラム

99.7.アクセスカウンタ(count)

画像合成式アクセスカウンタです。
参考<http://w3.lab.kdd.co.jp/technotes/WWW/CGI/gifonfly.html>

ユーザレベルのURLでカウント制限します。他ページからの不正利用を防止します。

99.7.1.主な特徴

  1. 独自のルーチンとflockを利用しているため,カウントがクリアされません
  2. 指定したURL階層以外のページからの,カウントはしない
一部のサイトに見られるのですが
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.制限事項

  1. flockが使えない場合,flock命令を省いても構いませんが,カウントが重複する場合があります
    いずれにしてもゼロクリアされることはありません
  2. 画像を読み込まない設定をしている人のカウントはしません
99.7.4.flyの入手
  1. 以下のサイトより,自分のプロバイダにあったOSのファイルを入手して下さい
    GIFs on the FLY
    Precompiled binaries are available for some operating systemsの章

  2. .tar.gzファイルを解凍します。例では,fly_x.gzという名前で保存した場合です
    1. UNIXのシェルを利用する場合
      kibita(*)gzip -d fly_x.gz この時,名前が変わります(ex.fly_OS)
      kibita(*)tar xvf fly_OS

    2. Windowsの場合
      DropEx!で解凍(窓の杜:圧縮・解凍・変換で配布 TAR32.DLLも必要)
      1. 解凍先ディレクトリを指定します
      2. エクスプローラ上でfly_x.gzを右クリック:コピー(C),DropEX.exeを右クリック:貼り付け(P)。(DropEx!作者の推奨する方法ではありません)
        .tar形式のファイルに変換されます
      3. そのファイルを上項と同様にします。このとき『処理の選択』ボックスが表示されたら『TARの解凍』でOKを押します

    3. ftpでflyをbinary転送します
      kibita(*)cd /home/foo
      kibita(*)binary
      kibita(*)put fly
      kibita(*)quote site chmod 705 fly
99.7.5.設置方法

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です。

  1. <IMG SRC="count.cgi?width=6&increment=0&link=xyz">
    カウントファイル(xyz.txt),桁数6,増分0
  2. <IMG SRC="count.cgi?link=index">
    カウントファイル(index.txt),桁数は,カウンタ値の桁数,増分1
  3. <IMG SRC="count.cgi?increment=-5&link=pochi">
    カウントファイル(pochi.txt),桁数は,カウンタ値の桁数,増分-5(ゼロクリアなどに利用)

[HOME][戻る]

Copyright (c)1997 GOMASUKE
Since 06/12/1997, Last Updated 06/12/1997