#!/usr/local/bin/perl # アクセスカウンターファイルのカウントアップと表示(サンプル用) # cntup.txtとファイルを変えた以外同じ # id=cnt3up.cgi # 更新日 00.4.14 # 累計のIMG出力 # 最初のIMG出力処理なのでカウントアップのルーチンつける # カウントベスト5記録追加 97.11.10 # 7日間記録追加 97.11.15 # 1年後の加算は前年データをクリアしてから加算する 98.10.17 # 変更箇所は、$i の数字のみ # 4桁目は、$keta[0] $i = 0; ############################### $file = "/dialup/chichibu/cgi-bin/acscnt3.dat"; #最初の処理するCGIなのでカウントアップする &cntup; # 表示するカウンターの桁数 $max = 4; # ファイルを同時にOPENするのでロックをかける open (DATA,"$file") ; flock(DATA,2); $cnt = ; flock(DATA,8); close (DATA); # 各カウント項目に分解する(区切り記号は,使用) # 初回のカウント時処理 @cnt = split(/,/,$cnt); # 本日は$cnt[4]、これを4桁に分解し配列にセットする @keta = &split_number($cnt[4]); $k = $keta[$i]; # GIFファイル名 $img = "/dialup/chichibu/gazo/$k.gif"; # GIFファイルを開く # GIFファイルの情報(ファイルサイズ)を取り出す open (GIF, $img); flock(GIF,2); @gifdata = stat($img); $byte = $gifdata[7]; # ヘッダを出力 print "Content-type: image/gif\n"; print "Content-length: $byte\n"; # ヘッダの終わりを出力 print "\n"; # GIFファイルの中味を表示 print ; # GIFファイルを閉じる flock(GIF,8); close(GIF); # アクセス数を1桁の数字に分割する sub split_number { local($n) = @_; local(@n) = split(//,$n); while ($#n + 1 < $max) { @n = (0,@n); } @n; } # カウントアップルーチン sub cntup { # 現在時刻セット ($bb,$ff,$jj,$dd,$mm,$yy,$yb) = localtime; # 返される月数は1つ少ない $mm++; # 西暦4桁処理 if ($yy < 70) { $yy = $yy + 2000;} else { $yy = $yy + 1900;} # 月日を2桁にする $mm = sprintf("%.2d",$mm); $dd = sprintf("%.2d",$dd); open (DATA,"$file") ; $cnt = ; close (DATA); # 各カウント項目に分解する(区切り記号は,使用) # 初回のカウント時処理 if ($cnt ne "") { @cnt = split(/,/,$cnt); } # 累計 $cnt[0] = $cnt[0] + 1; # 月が変わった時のみカウントを1に戻すための判定処理 (98.10.17) if ($cnt[2] == $mm) { $chg=0 } else { $chg=1 } # 本日計(本日最初はデータを最終日項目にセットする) if ($cnt[1] == $yy && $cnt[2] == $mm && $cnt[3] == $dd) {$cnt[4] = $cnt[4] + 1} else{ # 7日間記録シフト処理 &day7; # ベスト5処理 &best5; $cnt[5] = $cnt[1];$cnt[6] = $cnt[2];$cnt[7] = $cnt[3];$cnt[8] = $cnt[4]; $cnt[1] = $yy;$cnt[2] = $mm;$cnt[3] = $dd;$cnt[4] = 1;} # 時間帯別 # 6時から12時 ...13 # 12時から18時...14 # 18時から24時...15 # 0時から6時 ...16 if ($jj > 6 && $jj <= 12) { $tn = 13 } elsif ($jj > 12 && $jj <= 18) { $tn = 14 } elsif ($jj > 18 && $jj <= 24) { $tn = 15 } else { $tn = 16 } # 該当する配列に加算 $cnt[$tn] = $cnt[$tn] + 1; # 月別 # 1月の配列番号は17から始まる $tn = $mm + 16; # 月が変わった時のみカウントを1に戻す (98.10.17) if ($chg == 1) { $cnt[$tn]=1 } else { $cnt[$tn] = $cnt[$tn] + 1; } # ファイル登録 open(DATA,">$file"); flock(DATA,2); foreach $key (@cnt) { if ($key eq "") {$key = "0"} print DATA $key; print DATA ","; } flock(DATA,8); close (DATA); } # end of cntup ########################## #  7日間記録処理    # ########################## # 1日前 2日前 3日前 4日前 5   6   7 # (39,40) (41,42) (43,44) (45,46) (47,48) (49,50) (51,52) sub day7 { # 6日間シフト for ($i=0; $i<=5; $i++) { # 日付 $a=49 - (2 * $i); $b=$a + 2; $cnt[$b] = $cnt[$a]; # 件数 $a=50 - (2 * $i); $b=$a + 2; $cnt[$b] = $cnt[$a]; } # end of for # 昨日(最終日)をセット $cnt[39] = $cnt[1].$cnt[2].$cnt[3]; $cnt[40] = $cnt[4]; } # end of sub ########################## # カウントベスト5処理 # ########################## sub best5 { # ベスト1 2   3   4   5 # (29,30) (31,32) (33,34) (35,36) (37,38) $i = 0; # 日付をキーとした連想配列をつくる for ($a=29; $a<=37; $a++) { $i=$cnt[$a]; $a++; $bestcnt{$i} = $cnt[$a]; } # end of for # 次に、昨日件数を配列に追加する $i = $cnt[1].$cnt[2].$cnt[3]; $bestcnt{$i} = $cnt[4]; # 降順にソートして上位5番を記録する @bestcnt2 = sort by_kensu keys(%bestcnt); $no=0; $t=29; foreach (@bestcnt2) { # 5つのデータのみ $no++; if ($no > 5) { last; } $cnt[$t] = $_ ; $t++; $cnt[$t] = $bestcnt{$_} ; $t++; } # end of foreach } # end of sub # 月別数ソート sub by_kensu { $bestcnt{$b} <=> $bestcnt{$a}; } ##### end of script #####