#!/usr/bin/perl
## -------------------------------------------------------------------
## DAY COUNTER v2.2
## by KENT (98/08/29)
## E-MAIL: kent@lemon.ne.jp
## URL: http://www.lemon.ne.jp/~kent/
## 1.このスクリプトはフリーソフトです。このスクリプトを使用したいかなる
## 損害も作者はその責を負いません。
## 2.設置に関する質問は直接メールではお受けできませんので「サポート掲示板」
## へお願いいたします。
## -------------------------------------------------------------------
## [タグの書き方の例]
## 総カウント数
## 本日のカウント数
## 昨日 〃
## -------------------------------------------------------------------
require './gifcat.pl'; # gifcat.plが同一ディレクトリにある場合
## 基本設定
$figure1 = 5; # 総カウント数の桁数
$figure2 = 3; # 本/昨日カウント数の桁数
$logfile = './daycount.dat'; # 記録ファイル
$gif_path1 = './gif1'; # 総カウント用GIF画像のディレクトリ
$gif_path2 = './gif2'; # 本/昨日カウント用GIF画像の 〃
$ip_key = 1; # 同一IPアドレスはカウントアップ (0=しない 1=する)
$lockkey = 1; # ファイルロック機構 (0=no 1=symlink 2=open)
$lockfile = './daycount.lock'; # ロックファイル名
$type = 1; # タイプ (総カウント数の不要の方は 0とする)
## 設定完了
# 引数を解釈
$mode = $ENV{'QUERY_STRING'};
# 更新系処理でないならば2秒待たせる
if ($type == 1 && $mode ne "gif") { sleep(2); }
elsif ($type == 0 && $mode eq "yes") { sleep(2); }
# ロック開始
if ($type == 1 && $mode eq "gif" && $lockkey == 1) { &lock1; }
elsif ($type == 1 && $mode eq "gif" && $lockkey == 2) { &lock2; }
elsif ($type == 0 && $mode eq "today" && $lockkey == 1) { &lock1; }
elsif ($type == 0 && $mode eq "today" && $lockkey == 2) { &lock2; }
# 記録ファイルから読み込み
open(LOG,"$logfile");
eval 'flock(LOG,2);';
@lines = ;
eval 'flock(LOG,8);';
close(LOG);
$lines[0] =~ s/\n//g;
# 記録ファイルを分解
($day_key,$yes,$today,$count) = split(/<>/, $lines[0]);
# 日時を取得
$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
# 本日のカウント数をキーにしてカウントアップ
if (($type == 1 && $mode eq "gif") || ($type == 0 && $mode eq "today")) {
$ip = $ENV{'REMOTE_ADDR'};
if ($day_key != $mday) {
$yes = "$today";
$today = 1;
@lines = ();
}
else {
if($ip_key == 0){ &ip_check; }
$today++;
}
# カウントアップ処理
$count++;
# 記録ファイルを更新する
$lines[0] = "$mday<>$yes<>$today<>$count\n";
if($ip_key == 0){ push(@lines,"$ip\n"); }
open(LOG,">$logfile");
eval 'flock(LOG,2);';
print LOG @lines;
eval 'flock(LOG,8);';
close(LOG);
}
# ロック解除
if (-e $lockfile && $type == 1 && $mode eq "gif") { unlink($lockfile); }
elsif (-e $lockfile && $type == 0 && $mode eq "today") { unlink($lockfile); }
&count_view;
exit;
# カウンター出力処理
# (とほほさんの wwwcounterを参考にさせていただきました)
sub count_view {
$count += 0;
$cntstr1 = sprintf(sprintf("%%0%dld", $figure1), $count);
$cntstr2 = sprintf(sprintf("%%0%dld", $figure2), $today);
$cntstr3 = sprintf(sprintf("%%0%dld", $figure2), $yes);
# 総カウント処理
if ($mode eq "gif") {
printf("Content-type: image/gif\n");
printf("\n");
for ($i=0; $i$lockfile");
close(LOCK);
} else {
if(-e $lockfile) { unlink($lockfile); }
exit;
}
}
# IPアドレスをチェック
sub ip_check {
@DATA = @lines;
$flag = 0;
foreach $line (@DATA) {
chop($line);
if($line eq "$ip"){ $flag = 1; last; }
}
if($flag == 1) {
if (-e $lockfile) { unlink($lockfile); }
&count_view;
exit;
}
}