#!/usr/local/bin/perl require 'cgi-lib/perl-lib.pl'; # サイトのURL # http://及び、ファイル名(index.html等)は省略 # 【例】www.inforyoma.or.jp/~terra $usersite = 'www.tryhp.net'; # ダミー画像のファイルパス $image = 'cgi-images/exspc.gif'; # カウントを保存するデータベース # DBMですので拡張子は指定しない $dbmfile = 'pagecnt'; # 監理者パスワード $root = 'abcd1234'; # -- ここからがメインルーチン -- # ページからページの名称を取得 readparts('QUERY', '<>', ''); if ($QUERY{'pw'} eq $root) { print "Content-type: text/html\n\n"; print " ページカウンタアクセスログ "; # カウンタDBMをオープン # 読み込み専用なので0644でアクセス dbmopen(%DBM, $dbmfile, 0644); # ページの数だけループしてデータを読込む foreach $key (keys %DBM) { $count = $DBM{$key}; # 最大値を取得 $max < $count && ($max = $count); # 並び替えの為カウント数を0をサプレスしない # 8桁の整数に統一する $count = sprintf("%08d", $count); # 書式を整えて配列@ACCESSに代入 $value = "$count\t$key"; push(@ACCESS, $value); } # DBMをクローズ dbmclose(%DBM); # アクセスの多い順に並び替え @ACCESS = reverse(sort(@ACCESS)); print "
\n"; print "\n"; print "\n"; foreach (@ACCESS) { ($count, $page) = split(/\t/, $_); $count += 0; print ""; print "\n"; print "\n"; if ($max) { $point = sprintf("%3.1f", int($count / $max * 1000 + 0.5) / 10); $barwidth = $point * 20 / 100; print "\n"; print "\n"; } else { print "\n"; print "\n"; } print "\n"; } print "
ページ カウント グラフ ポイント
$page$count"; foreach (1 .. $barwidth) { print "■"; } print "$point
\n"; print "
\n"; print "\n"; exit; } # アクセスの記録 if ($QUERY{'page'}) { # ページが指定されている場合にだけ記録 # perl-libのロックに成功すれば書き込み # 失敗すればDBMを守る為このアクセスを無視 if (!dblock($dbmfile)) { # 連想配列%DBMをファイルに結合してオープン dbmopen(%DBM, $dbmfile, 0666); # ページ名のカウントを1プラスして保存 $DBM{$QUERY{'page'}}++; # DBMを閉じる dbmclose(%DBM); # ロックを解除 dbunlock($dbmfile); } } print "Content-type: image/gif\n\n"; open(IMG,$image); binmode(IMG); binmode(STDOUT); print $_ while (); close(IMG); exit;