B05:来場者ごとに閲覧日数で画像を変える

ページの作りによっては、何度も同じページに戻ってしまい、その度にカウンタが加算されてしまう事があると思います。
今回は、Cookieを利用して来場者ごとに閲覧日数を数えて表示する画像を変えるようなCGIを紹介します。
同じページを同じ日に何度閲覧してもカウンタが増えるのは1回だけですが、別の日に閲覧すれば再びカウンタが増えるようになっています。

ファイルを開く

解説
#!/usr/local/bin/perl
プロバイダがPerlを置いている場所を記述します。
ここでは/usr/local/bin/perlにあるとしています。
$max=15;
@picture=("00.png","01.png","02.png","03.png","04.png","05.png","06.png","07.png","08.png","09.png","10.png","11.png","12.png","13.png","14.png");
表示する絵の枚数を$maxに、ファイル名を@pictureに代入しています。
@weekchar=("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
@monchar=("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
Cookieに保存する時に曜日と月の文字列が必要になるので配列に代入しています。
foreach $data (split(/; */,$ENV{'HTTP_COOKIE'})){
  ($name,$value)=split(/=/,$data);
  $COOKIE{$name}=$value;
}
Cookieの情報を取得して解析しています。
($sec,$min,$hour,$mday,$mon,$year,$week)=gmtime(time()+60*60*24*30);
$year=$year+1900;
$time=sprintf("%s, %d-%s-%d %02d:%02d:%02d GMT",$weekchar[$week],$mday,$monchar[$mon],$year,$hour,$min,$sec);
time()は時刻が秒数で取得できるので、60*60*24*30を加算して一ヵ月後にしています。
gmtimeを使うとGMTによる時刻に変換できます。
CookieはGMTによる時刻で保存期間を指定できるので、その為の文字列を$timeに代入しています。
($oldday,$count)=split(/,/,$COOKIE{'KMCGIB05'});
if($count eq ""){
  $count=1;
}else{
  if($oldday!=$mday){
    $count=$count+1;
  }
  if($count==($max+1)){
    $count=1;
  }
}
ここではKMCGIB05という名前でCookieに保存されている情報を取得しています。
取得した情報は、Cookieが保存された日付と、閲覧日数として扱います。
Cookieが保存された日付と本日の日付が異なる場合だけ閲覧日数を加算しています。
閲覧日数によって表示する画像を変化させます。
画像の枚数には限りがあるので、閲覧日数が枚数を超えたら初期化しています。
☆今回のポイント☆
前回の日付と違う時だけ値を加算しよう!
printf("Content-type:image/png\n");
printf("Set-Cookie:KMCGIB05=$mday,$count; expires=$time;\n\n");
$size = -s $picture[$count-1];
open(OUT, $picture[$count-1]);
binmode(OUT);
read(OUT, $buf, $size);
close(OUT);
binmode(STDOUT);
print $buf;
CookieにKMCGIB05という名前で情報を保存しつつ、$picture[$count-1]が示すファイル名の画像を出力しています。
Cookieには加算済みの値である$countを保存するので、表示する画像は$count-1番目を選択しています。
exit;
プログラムを終了させます。