10

ユーザー入力によって行を削除するサンプル php スクリプトを考えてみましょう。

$DELETE_LINE = $_GET['line'];
$out = array();
$data = @file("foo.txt");
if($data)
{
    foreach($data as $line)
        if(trim($line) != $DELETE_LINE)
            $out[] = $line;
}
$fp = fopen("foo.txt", "w+");
flock($fp, LOCK_EX);
foreach($out as $line)
    fwrite($fp, $line);
flock($fp, LOCK_UN);
fclose($fp); 

一部のユーザーが現在このスクリプトを実行しており、ファイル「foo.txt」がロックされているかどうかを知りたいのですが、同時またはその実行が完了する前に、他のユーザーがこのスクリプトを呼び出した場合、何が起こりますか? 2 番目のユーザーのプロセスは、最初のユーザーによるファイルのロック解除を待ちますか? または 2 番目のユーザー入力による行の削除は失敗しますか?

4

1 に答える 1

24

別のプロセスがファイルをロックしているときに排他ロックを取得しようとすると、その試行はファイルがロック解除されるまで待機します。これがロックの要点です。

の Linux ドキュメントを参照してください。このドキュメントではflock()、オペレーティング システム全体での一般的な動作について説明しています。PHP は内部でfcntl()を使用するため、NFS 共有は通常サポートされています。

タイムアウトはありません。自分でタイムアウトを実装したい場合は、次のようにすることができます。

$count = 0;
$timeout_secs = 10; //number of seconds of timeout
$got_lock = true;
while (!flock($fp, LOCK_EX | LOCK_NB, $wouldblock)) {
    if ($wouldblock && $count++ < $timeout_secs) {
        sleep(1);
    } else {
        $got_lock = false;
        break;
    }
}
if ($got_lock) {
    // Do stuff with file
}
于 2013-09-16T17:11:16.037 に答える