※このサンプルの解説は、「CGI(Perl)の解説」をすべて読み終えてる方を前提としています。
後になるほど省略されている場合がありますのでできるだけ順番に読んでください。
また、実行に際しては、サーバーでPHPが利用できる事を前提に解説しています。
■ 昨日、今日、累計を表示するアクセスカウンタの作成
それでは今回は、今日のカウンタ、昨日のアクセスカウンタも管理できるように変更してみます。
では、昨日とか今日はどのように判断したらいいのでしょうか?
それは、現在の日付を記録しておき、再度、現在の日付を確認します。
記録した日付と現在の日付が一致した場合、今日ということになります。
一致しなかった場合は、日付が変わったということで翌日になった、と判断できます。
日付が変わった時点で、「今日」のカウンタ値を「昨日」のカウンタ値にコピーし、「今日」のカウンタ値を「0」クリアするようにします。
- 【 解 説 】
-
まず、記録するデータは、「年月日」、「累計アクセス数」、「今日のアクセス数」、「昨日のアクセス数」の4項目を次のようにそれぞれ「,(カンマ)」で区切って記録するようにします。
2005/01/01,0,0,0上記のデータを、「acccnt3f.cgi」という名前で前もって作成しておきます。
今日の日付を取得する方法は今までに解説したとおりで、次のような手順で「年月日」だけを取得します。
$day0 = date("Y/m/d", date("U"));現在の記録情報は次のような手順で取得することができます。
$filnam = "acccnt3f.cgi"; $fp = fopen($filnam,"r"); $filbuf = fgets($fp); fclose($fp);ただ、このままでは使えませんから、各項目に分解するため、「,(カンマ)」で区切りながら複数の変数にそれぞれセットします。
この時便利な命令が「split()」関数で次のようにすれば複数の変数を1回でセットできます。
list($dayc, $totalc, $todayc, $yesdc) = split(",", $filbuf);「list()」関数は、配列の内容をそれぞれの変数に分解セットする関数です。
次に、今取得した日付と今日の日付が一致していない場合の、「if」文は次のように記述します。
if ($day0 != $dayc){ }else{ }したがって、上記の「if」文を使いそれぞれの条件に合った処理を加えると次のようになります。
if ($day0 != $dayc){ $yesdc = $todayc; $todayc = 0; }また、累計カウントや今日のカウントを「1」カウントアップするにはCGIで言うところのオートインクリメント演算子(PHPでは「加算子」と言います。)を使って次のように記述できます。
$totalc++; $todayc++;そして、これらのデータをファイルに書き込むには次のように記述します。
$filnam = "acccnt3f.cgi"; $fp = fopen($filnam,"w"); fwrite($fp,"$day0,$totalc,$todayc,$yesdc"); fclose($fp);今回、カウンタのファイル名は「acccnt3f.cgi」としました。
このファイル名は何でもいいのですが、セキュリティの意味で拡張子は「.cgi」
にしておくことをお勧めします。このようにしておくと、訪問者がこのファイルを覗こうとした時、自動的にCGIとして実行しようとしますが、中身がCGIではないのでエラーが発生します。
したがって、覗こうとしてもエラーが発生して覗けなくなるからです。
では、上記の内容を使用して「昨日、今日、累計のアクセスカウンタ」を作成してみます。
なお、今回のサンプルでは排他制御(同時書き込み時の制御)は行っていません。
Windows環境の排他制御については「PHPの予備知識」−「ファイル書き込みの排他制御」をご参照下さい。
- 【記述サンプル】
- print <<< END_DOC <HTML> <HEAD> <title>昨日、今日、累計を表示するカウン</title> </HEAD> <BODY> END_DOC; $day0 = date("Y/m/d", date("U")); $filnam = "acccnt3f.cgi"; $fp = fopen($filnam,"r"); $filbuf = fgets($fp); fclose($fp); list($dayc, $totalc, $todayc, $yesdc) = split(",", $filbuf); if ($day0 != $dayc){ $yesdc = $todayc; $todayc = 0; } $totalc++; $todayc++; $filnam = "acccnt3f.cgi"; $fp = fopen($filnam,"w"); fputs($fp,"$day0,$totalc,$todayc,$yesdc"); fclose($fp); print "今日の日付:$day0<br>\n"; print "累計のカウント:$totalc<br>\n"; print "今日のカウント:$todayc<br>\n"; print "昨日のカウント:$yesdc"; print <<< END_DOC </BODY> </HTML> END_DOC;