#!/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; } }