#!/usr/bin/perl # # CGIアクセスカウンタ(テキスト) # # $RCSfile: cgicount.cgi $ # $Revision: 1.9 $ # # Copyright (C) 1997,1998 by Hiroshi Yuki. # All rights reserved. # 結城浩 # http://www.st.rim.or.jp/~hyuki/ # #『Perlで作るCGI入門 応用編』 結城浩著 ソフトバンク(株)刊 ISBN4-7973-0581-9 # ########## # 設定部分 # ↓(あなたが設定)カウンタファイル名 $countfile = "./cgicount.cnt"; # ↓(あなたが設定)HTMLファイル名(この中に特殊タグを含めておく) $htmlfile = "./index.html"; ########## # ↓アクセスカウンタの内容に置換される特殊タグ $countertag = ''; ########## # カウンタファイルの形式 # 1行目:これまでの累積カウント数 # 2行目:昨日のカウント数 # 3行目:今日のカウント数 # 4行目:最終カウント年月日 ########## # ロック関連 $uselock = 1; # ロックを使うなら1。うまく動かないとき0にする。 # HTTPヘッダ print "Content-type: text/html\n"; print "\n"; # データファイルのオープン if (!open(OUT, "+<$countfile")) { $msg = '[not found]'; &show_page; exit(0); } # ファイルのロック if (!&lock_file(OUT)) { $msg = '[lock error]'; &show_page; exit(0); } # ロックをかけることができたのでファイルを更新 # カウンタ値の取得 seek(OUT, 0, 0); $totalcount = 1 + ; $yesterdaycount = 0 + ; $todaycount = 1 + ; $lastday = ; ( $sec, $min, $hour, $day, $mon, $year ) = localtime(time); $mon++; $year += 1900; $today = "$year-$mon-$day\n"; # 今日はじめてのアクセスか? if ($today ne $lastday) { ( $sec2, $min2, $hour2, $day2, $mon2, $year2 ) = localtime(time - 24*60*60); $mon2++; $year2 += 1900; $yesterday = "$year2-$mon2-$day2\n"; if ($yesterday ne $lastday) { # 昨日はアクセスしなかった $yesterdaycount = 0; } else { $yesterdaycount = $todaycount; } $todaycount = 1; $lastday = $today; } seek(OUT, 0, 0); print OUT "$totalcount\n"; print OUT "$yesterdaycount\n"; print OUT "$todaycount\n"; print OUT "$lastday"; &unlock_file(OUT); close(OUT); # 置換メッセージの構築 $msg = <<"end_msg"; 昨日は $yesterdaycount 回のアクセスがありました。
今日は $todaycount 回のアクセスがありました。
これまでに累積 $totalcount 回のアクセスがありました。
end_msg &show_page; # 終了 exit(0); ########## # HTMLファイルの表示 sub show_page { if (!open(HTML, "$htmlfile")) { print "

$htmlfileが見つかりません。

\n"; exit(0); } @html = ; close(HTML); for ($i = 0; $i < @html; $i++) { if ($html[$i] =~ /$countertag/i) { $html[$i] =~ s/$countertag/$msg/gi; } print $html[$i]; } } # ロック sub lock_file { local(*FILE) = @_; if ($uselock) { eval("flock(FILE, 2)"); # 2=LOCK_EX if ($@) { # flock が使えない場合、ここに来る。 return 0; } } return 1; } # アンロック sub unlock_file { local(*FILE) = @_; if ($uselock) { eval("flock(FILE, 8)"); # 8=LOCK_UN } }