※このサンプルの解説は、「CGI(Perl)の解説」をすべて読み終えてる方を前提としています。
■ 昨日、今日、累計を表示するカウンタの作成
これまでに簡単なアクセスカウンタを作成する方法を説明してきました。
今回は、それを少し強化して今日のカウンタ、昨日のカウンタをも管理できるようにしてみましょう。
では、昨日とか今日はどのように判断したらいいのでしょうか?
それは、現在の日付を記録しておき、再度、現在の日付を確認します。
記録した日付と現在の日付が一致した場合、今日ということになります。
一致しなかった場合は、日付が変わったということで翌日になった、と判断できます。
日付が変わった時点で、「今日」のカウンタ値を「昨日」のカウンタ値にコピーし、「今日」のカウンタ値を「0」クリアするようにします。
- 【 解 説 】
-
まず、記録するデータは、「年月日」、「累計アクセス数」、「今日のアクセス数」、「昨日のアクセス数」の4項目を次のようにそれぞれ「,(カンマ)」で区切って記録するようにします。
2005/01/01,0,0,0上記のデータを、「acccnt3f.cgi」という名前で前もって作成しておきます。
今日の日付を取得する方法は今までに解説したとおりで、次のような手順で「年月日」だけを取得します。
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(); $fmt0 = "%04d/%02d/%02d"; $day0 = sprintf($fmt0, $year+1900,$mon+1,$mday);現在の記録情報は次のような手順で取得することができます。
$filnam = "acccnt3f.cgi"; open(FP,"<$filnam"); $filbuf = <FP>; close(FP);しかし、このままでは使えませんから、カンマで区切りながら複数の変数にそれぞれセットします。
この時便利な命令が「split()」関数で次のようにすれば複数の変数を1回でセットできます。
($dayc, $totalc, $todayc, $yesdc) = split(",", $filbuf);「split()」関数の結果は、リスト形式か、配列変数で取得します。
次に、今取得した日付と今日の日付が一致していない場合の、「if」文は次のように記述します。
if ($day0 ne $dayc){ }else{ }
したがって、上記の「if」文を使いそれぞれの条件に合った処理を加えると次のようになります。
if ($day0 ne $dayc){ $yesdc = $todayc; $todayc = 0; }また、累計カウントや今日のカウントを「1」カウントアップするにはオートインクリメント演算子を使って次のように記述できます。
$totalc++; $todayc++;そして、これらのデータをファイルに書き込むには次のように記述します。
$filnam = "acccnt3f.cgi"; open(FP,">$filnam"); print FP "$day0,$totalc,$todayc,$yesdc"; close(FP);
今回、カウンタのファイル名は「acccnt3f.cgi」としました。
このファイル名は何でもいいのですが、セキュリティの意味で拡張子は「.cgi」
にしておくことをお勧めします。このようにしておくと、訪問者がこのファイルを覗こうとした時、自動的にCGIとして実行しようとしますが、中身がCGIではないのでエラーが発生します。
したがって、覗こうとしてもエラーが発生して覗けなくなるからです。
では、上記の内容を使用して「昨日、今日、累計のアクセスカウンタ」を作成してみます。
なお、今回のサンプルでは排他制御(同時書き込み時の制御)は行っていません。
Windows環境の排他制御については「CGI(Perl)の予備知識」−「ファイル書き込みの排他制御」をご参照下さい。
- 【記述サンプル】
- #!/usr/bin/perl print << "END_DOC"; Content-type:text/html\n\n <HTML> <HEAD> <title>昨日、今日、累計のアクセスカウンタの表\示</title> </HEAD> <BODY> END_DOC ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(); $fmt0 = "%04d/%02d/%02d"; $day0 = sprintf($fmt0, $year+1900,$mon+1,$mday); $filnam = "acccnt3f.cgi"; open(FP,"<$filnam"); $filbuf = <FP>; close(FP); ($dayc, $totalc, $todayc, $yesdc) = split(",", $filbuf); if ($day0 ne $dayc){ $yesdc = $todayc; $todayc = 0; } $totalc++; $todayc++; $filnam = "acccnt3f.cgi"; open(FP,">$filnam"); print FP "$day0,$totalc,$todayc,$yesdc\n"; close(FP); print "今日の日付:$day0<br>\n"; print "累計のカウント:$totalc<br>\n";print "今日のカウント:$todayc<br>\n"; print "昨日のカウント:$yesdc"; print << "END_DOC"; </BODY> </HTML> END_DOC