アプリ版:「スタンプのみでお礼する」機能のリリースについて

関数flock();について調べてたのですが、
結局、イマイチ使い所がわかりませんでした。

とりあえずCGIを手本として以下のロックを作ってみたのですが、
もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。


↓参考プログラム(echo部は進行を表示するためのもの)

<?php
define ("LOCK_FILE","./lock/lock.txt");

Lock();
Unlock();

//ロック
function Lock(){
if(file_exists(LOCK_FILE)){
if(date(U) - filemtime(LOCK_FILE) > 30){
unlink(LOCK_FILE);
echo("古いロック削除<br>");
}
}

$retry = 5;
while(file_exists(LOCK_FILE)){
if($retry <= 0){
echo ("error<br>");
exit;
}
$retry--;
sleep(1);
}
$lockfile = fopen(LOCK_FILE,"w");
fclose($lockfile);
echo("ロック完了<br>");
}

//アンロック
function UnLock(){
unlink(LOCK_FILE);
echo("ロック解除<br>");
}
?>

A 回答 (2件)

flock()は開いたファイルに対して排他制御を行う関数です。


ですので使い方としては、

$fp = fopen(filename,"wt") ;
if ( !flock( $fp, LOCK_EX ) )
{
  //エラー処理&ファイルクローズ
  return ;
}
//ファイルに対する操作
if ( !flock( $fp, LOCK_UN ) )
{
  //エラー処理&ファイルクローズ
  return ;
}
fclose($fp) ;

という感じになります。
複数の人がほぼ同時にこの処理が動くページにアクセスしたら、先にアクセスした人がファイルに対してロックをかけてしまうので、後にアクセスした人は最初のflockでfalseが返されてエラー処理が実行されます。

この回答への補足

ということは、このfilenameにロック用ファイルの、上の例で言うlock.txtを参照させればいいんですね。
そしてその後、排他ロックとロック解除の間で操作したい対象ファイルを弄ればいいと?
特にロック用ファイル中に記述する必要はないって事ですよね。

補足日時:2005/08/22 10:00
    • good
    • 0

> ということは、このfilenameにロック用ファイルの、上の例で言うlock.txtを参照させればいいんですね。


> そしてその後、排他ロックとロック解除の間で操作したい対象ファイルを弄ればいいと?
> 特にロック用ファイル中に記述する必要はないって事ですよね。


いいえ、間違っています。
flockはファイルをオープンしたときのファイルポインタを設定します。
つまり、ロック用のファイルを自分で用意する必要はありません。PHP側でロック処理をしてくれます。

参考URL:http://php.s3.to/man/function.flock.html,http:// …

この回答への補足

少し出かけていたので返事が遅れました。

ということは、filenameに対象ファイルを当てはめるわけですか?
しかしそれだと、排他ロックエラーの際に、
データが真っ白になってしまう可能性が出てきますよね。
その場合は、エラー時の対処のif部分で、
再度書き直すのが常套ということになるのでしょうか?
質問ばかりでスミマセン。

補足日時:2005/08/25 23:10
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!