カウンター その6
アクセスログとカウンターログを一つにまとめてみました。
ファイル名counter06.cgiを作成し、下のソースを貼り付けてパーミションを755にします。
データ保存用ファイル空ファイルをcount.dat作成し、パーミションを666にします。
ソース counter06.cgi
#!/usr/bin/perl
#カウンター
#ログファイル一つにまとめる
#読み込みファイルcount.datはCGI設置フォルダと同じところに設置
#現在の時刻と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(IN, "count.dat");
chomp( @count = <IN> );
close(IN);
#今日始めての訪問か判定する
$today = 0;
foreach(@count ){
if( /$nitiji $addr/){ $today = 1; }
}
#今日始めての訪問の場合
if ( $today == 0 ){
#一日前の日付けとカウント数は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]++;
#アクセスログはsplice関数を使って[4]5番目に押入
$rec2 = "$nitiji $addr";
splice( @count,4,0,$rec2 );
#アクセスログの記憶数
$data_max = 15;
if ($#count > ($data_max +3)){
$#count = $data_max +3;
}
# カウント書き込み
open(OUT,">count.dat");
foreach $rec ( @count ) {
print OUT "$rec\n";
}
close(OUT);
}
#2回目以降訪問の場合
else {
open(COUNTIN,"count.dat") ;
@count = <COUNTIN>;
close(COUNTIN);
}
# 出力ブラウザにカウントアップした値を表示。
#昨日の件数
( $yestaday,$yestaday_count ) = split( / /,$count[3] );
#今日の件数
$today_count = $count[1];
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>今日のカウント</td><td>$today_count</td></tr>
<tr><td>昨日のカウント</td><td>
HTML
#昨日のカウント数がない場合の処理
if ($yestaday_count eq $addr ){
print ' ';
}
else {
print "$yestaday_count\n";
}
print <<"END";
</td></tr>
</table>
</body>
</html>
END
exit;
__END__
|
