カウンター その5
上のカウンターの応用で過去3日分のアクセス数を表示
ファイル名counter05.cgiを作成し、下のソースを貼り付けてパーミションを755にします。
アクセスログ記録用空ファイルをaccess.dat作成し、パーミションを666にします。
データ保存用ファイル空ファイルをcount.dat作成し、パーミションを666にします。
サンプル
ソース counter05.cgi
#!/usr/bin/perl
#カウンター
#現在の時刻とIPアドレスを読み込み
($sec,$min,$hour,$day,$mon,$year,$wday) = localtime(time);
$nitiji=sprintf("%04d年%02d月%02d日",$year +1900,$mon +1,$day);
$addr=$ENV{'REMOTE_ADDR'};
#アクセスファイルオープン
open(ACCESSFILE, "access.dat");
@accesslog = <ACCESSFILE>;
close(ACCESSFILE);
#今日始めての訪問か判定する
$today = 0;
foreach(@accesslog ){
if( /$nitiji $addr/){ $today = 1; }
}
#今日始めての訪問の場合
if ( $today == 0 ){
#データ保存用ファイルcount.datを同じフォルダにいれておく。
# 今までのカウンタ数を読み込んで変数に代入
#chomp関数を使って最後の改行コードを削除
open(IN,"count.dat") ;
chomp( @count = <IN> );
close(IN);
#一日前の日付けとカウント数はsplice関数を使って[3]4番目に押入
if ( $nitiji ne $count[2] ){
$rec = "$count[2] $count[1]";
splice( @count,3,0,$rec );
$count[1] = 0;
$count[2] = $nitiji;
}
#カウントアップ
$count[0]++;
$count[1]++;
#過去の日付け別カウント数の表示数を設定(3日分のアクセス数)
$max_cnt = 3;
if ($#count > ($max_cnt +1)){
$#count = $max_cnt +1;
}
# カウント書き込み
open(OUT,">count.dat");
foreach $rec ( @count ) {
print OUT "$rec\n";
}
close(OUT);
open(ACCESSFILE, ">access.dat");
unshift (@accesslog, "$nitiji $addr\n" );
#ログ保存数を設定($# は変数のインデックスの最大値を求める記述)
$data_max = 10;
if ($#accesslog > ($data_max -1)){
$#accesslog = $data_max - 1;
}
#アクセスファイル書き出し
print ACCESSFILE @accesslog;
close(ACCESSFILE);
}
#2回目以降訪問の場合
else {
open(COUNTIN,"count.dat") ;
@count = <COUNTIN>;
close(COUNTIN);
}
# 出力ブラウザにカウントアップした値を表示。
#「printf」は書式を付けてプリントする命令。
#「f」は書式(フォーマット)の意味。
#"%04d"が書式の指定です。
#"%04d"と書くと「4桁で先頭に0を付けて値を入れる」という意味。
print <<"HTML";
Content-type: text/html
<html><body>
<table border=2>
<tr><td>日付</td><td>件数</td></tr>
<tr><td>総数</td><td>$count[0]</td></tr>
<tr><td>$count[2]</td><td>$count[1]</td></tr>
HTML
foreach $aaa ( @count[3..$#count ] ){
( $dayday, $cnt ) = split( / /, $aaa );
print "<tr><td>$dayday</td><td>$cnt</td></tr>\n";
}
print <<"END";
</table>
</html></body>
END
exit;
__END__
|
