どうしてもカウンターがリセットされる現象を回避できなくて頭を悩ましていました^^;
どうもflock関数(ファイルロック)が理解できていなかったと言うのが結論。
にしても酷いな・・・・勉強の大切さを理解しました。
カウンターでこのざまなら掲示板はどうなるんだ?
最初から作り直したほうが早いかもな・・・・・インストーラも効率悪かったし^^;
すばらしく分かりやすく解説していただいたサイト
CGIやDBのロックと同時実行制御
#!/usr/bin/perl ####################################################### #スクリプト名:ROS カウンター Ver.1.03 #作者:ORBIT #著作権:ORBIT SPACEに帰属します。 #著作権表示は一切行いません。自由にお使いください。 ####################################################### #各種設定 #------------------------------------------------------ #イメージの保存ディレクトリ $imgs = './img/'; #ログの保存場所 $ip_log = 'ip.log'; $counts_log = 'counts.log'; #------------------------------------------------------ #IPを取得 $ip = $ENV{'REMOTE_ADDR'}; #GETのデータから位を取得 $buf = $ENV{'QUERY_STRING'}; --$buf; #過去ログの取得 open (IN_OUT,"+<$counts_log"); flock IN_OUT, 2; $counts_data = <in_OUT>; open (IP_IN_OUT,"+<$ip_log"); flock(IP_IN_OUT, 1); @ip_data = <ip_IN_OUT>; chomp($ip_data[0]); if($ip eq $ip_data[0]){&img;} $ip_data[0] = "$ip_data[0]n"; #インクリメントして保存 if($counts_data eq ""){$counts_data = "00000000"}; ++$counts_data; seek IN_OUT, 0, 0; print IN_OUT $counts_data; close(IN_OUT); #IPを記録 unshift @ip_data, "$ipn"; seek IP_IN_OUT, 0, 0; print IP_IN_OUT @ip_data; close(IP_IN_OUT); &img; # 画像表示 sub img{ #過去ログを取得し逆順に並べ替える @list = split(//,$counts_data); @img_list = reverse (@list); $nu = $img_list[$buf]; open(IG,"$imgs$nu.gif"); print "Content-type: image/gifnn"; binmode(IG); binmode(STDOUT); print <ig>; close(IG); exit; }
0 Comments.