ROS カウンター Ver.1.03

どうしてもカウンターがリセットされる現象を回避できなくて頭を悩ましていました^^;
どうも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;
}

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(Spamcheck Enabled)

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)