#! /usr/local/bin/perl #****************************************************************** #ラグナカウンタ用カウンターCGI Byりょう #ホームページ:http://www.netlaputa.ne.jp/~ryo_w/ #配布ページ:http://www.netlaputa.ne.jp/~ryo_w/store/ragcount.html #****************************************************************** # #更新履歴 #2003.4.25 #やっぱり急いでトラブル対応するとロクなことないですな・・・ #ってことでファイルのクローズ方法変更。 #というか再訪問の時にCLOSEを余分に呼んでいたわけですが(笑ぇない #とりあえず動作には変わりはない ハズ # #2003.4.22 #count.dat内のデータの頭に0がついているときに #これを削除する処理を追加。 # #2003.4.22 #またクリティカルなバグが・・・・。 #次から気をつけます・・ペコペコ # #2003.4.17 #再訪問チェックをつけました。リロードのたびにカウントされるのが許せない方はどぞ # #2003.4.16 #かなりクリティカルなバグ修正。初期設定をそのまま使ってる方には影響はない・・ハズ #その他、英語の綴りミスを修正(ぉぃ # #2003.4.15 #新規作成。とりあえず必要な機能詰め込み。製作時間が数時間なのであやしげ。 # #主な機能 #・呼ばれると所定のカウンタファイルを読んでカウンタ+1 #・インクリメントされたカウントを返す #****************設定 #==========================カウンタファイル $count_file = "./count.dat"; #==========================再訪問チェキ #(1:有効 0:無効) $reload = 1; #==========================ファイルロックの種類 #1:マジメにflock 2:ロックファイル使ってロック 3:ロックなし。 #Perlのバージョンによって使えたり使えなかったりするので、 #1でダメだったら2にしてください。それでもダメなら0で。 #ロックしない場合は定期的にバックアップをとっておくことをオススメします。 $lock = 1; #==========================ロックファイル(用意する必要はありません) $lock_file = "./countlock"; #****************設定ここまで #本日の時刻取得 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); #クッキーぱくぱく $CCX = 1; if( $reload == 1 ){ @pairs = split(/;/,$ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ s/ //g; $COOKIE{$name} = $value; } $CC = $COOKIE{"reload"}; if ($CC eq '' || $CC != $mday) { print "Set-Cookie: reload=$mday\n"; $CCX = 1; #初回訪問 } else { $CCX = 0; } } #おまじない print "Content-Type: text/html\n\n"; #ファイルロック if( $lock == 1 ){ #Perl5以降ならflock flock( CNT, 2 ); open( CNT ,"$count_file") or die "opening file file!!"; }elsif($lock == 2){ #シンボリックリンクでロック $count = 0; while ( !symlink("$$","$lock_file") ) { if ( $count == 5 ) { #5回で十分ですよねぇ・・・(´Д`;) &error("Busy"); } $count++; sleep(2); } open( CNT ,"$count_file") or die "opening file faled!!"; }else{ open( CNT ,"$count_file") or die "opening file faled!!"; } $count = ; close(CNT); #頭についてる0を飛ばします #count.datの中身が「0」だとしても #その時は初訪問のはずなので+1されてうまくいくハズ $count =~ s/^0+//; #初回訪問の場合だけカウントアップ処理 if($CCX == 1){ $count++; open( CNT ,"+>$count_file") or die "opening file faled!!"; print CNT "$count"; close(CNT); } #ファイルのアンロック #表示より前に持ってきているのはロック時間をなるべく短くするため。 #標準出力はやっぱり時間かかりますからのう if( $lock == 1 ){ flock( CNT, 8 ); }elsif($lock == 2){ unlink($lock_file); } print "&count=$count&"; #Flashに渡す方はこれ。 #( ´_ゝ`)