ファイルロック
 複数の人が同時に同一のファイルに対して読み書きを行なうと正常に書き込まれない場合があります。そこで、ファイルロックにより1人がファイルにアクセスしている間は他の人がそのファイルにアクセスできないようにします。ファイルロックの方法として、ファイルロック関数flock、シンボリックリンク関数symlink、ディレクトリ作成関数mkdirを使用する方法があります。flock、symlinkはサーバによっては使用できない場合があるので、ここではmkdirによる方法を記述します。
 この方法はディレクトリの有無がファイルアクセスの有無を表します。mkdirがディレクトリの存在チェックと生成を同時に行えることを利用しています。処理の流れを下記に示します。

 1.ファイルアクセスの前にmkdirを実行します。
 2.mkdirはディレクトリが存在しなければディレクトリを生成し「真」を返します。
   既にディレクトリが存在すると「偽」を返します。
 3.「真」の場合はファイルアクセスを行います。
 4.「偽」の場合はウェイト後リトライします。
   指定回数リトライしても「偽」の場合はタイムアウトで終了します。
 5.ファイルアクセスが終了したらディレクトリを削除します。


sleep 指定した秒数スリープする。
     例 sleep(2);
■プログラム (sample26.cgi)
$lockfile = 'lock';
$cntfile = 'sample26.txt';
&lock;
open IN,"$cntfile"; $count = <IN>; close IN;
$count++;
open OUT,">$cntfile"; print OUT $count; close OUT;
&unlock;
open IN,"$cntfile"; $count = <IN>; close IN;
print $count;
###
sub lock {
$retry = 5;
while (!mkdir($lockfile,0755)) {
if (--$retry < 0) {&error("タイムアウト");}
sleep(1);
}
}
sub unlock {rmdir($lockfile);}

sub error {
print "$_[0]</body></html>\n";
exit;
}
■実行結果
28


HOME Copyright (C) CGI-design All Rights Reserved.