22

この回答に従って、実行中のphpスクリプトのインスタンスを1つだけ制限します。

<?php

  $fp = fopen("/tmp/one.txt", "r+");
  if (flock($fp, LOCK_EX)) {
    //
    do_something_lengthy();
    //
    flock($fp, LOCK_UN);
  } else {
    echo "Couldn't get the lock!";
  }

  fclose($fp);

?>

私の質問は、プロセスが途中で終了した場合、つまり を呼び出す前に、 flock'ed one.txt ファイルのロックが解除されますか?do_something_lengthy()flock($fp, LOCK_UN)

4

3 に答える 3

18

flock()そのPHPが内部で使用しているマニュアルページによると、ロックはflock()で呼び出されたLOCK_UNとき、または でディスクリプタが閉じられたときに解放されますfclose()

スクリプトが終了すると、PHP または OS のいずれかが開いているファイル記述子を閉じ、ロックを解放します。

上記の動作のため、このコミット(5.3) とこれ(5.2) は、PHP 自体でロック解除を行わないようにしました。

于 2012-11-23T02:17:34.650 に答える
6

この小さなスクリプトを作成してテストしました

header('Content-type:text/plain; charset=utf-8');

$dir = dirname(__FILE__);
$file = $dir.'/testflock.lock';
$fh = fopen($file, 'w+');

$unlocked = flock($fh, LOCK_EX | LOCK_NB);
echo 'Locked: '.$file.' ';var_dump(!$unlocked);echo PHP_EOL;
if($unlocked){
    sleep(10);
    throw new Exception();
}

私にとっては、OS がファイルのロックを解除するのに、例外がスローされない場合はスクリプトの実行が終了してから約 2 ~ 5 秒かかり、例外がスローされたためにスクリプトが停止してから最大 2 ~ 5 秒かかりました。

PHP 5.3.2 の時点でfclose($fh)はファイルのロックが解除されないことに注意してください。php でロックを解除しない限り、ファイルはロックされたままになるか、OS がロックを解除するのを待つ必要があります。 (これは私に起こりました)

ファイルのロックを解除するには:

flock($fh,LOCK_UN);

ファイル ハンドルを閉じるには (スクリプトの実行が終了すると自動的に呼び出されます)

fclose($fh);

なしでファイルをロックするLOCK_NBと、スクリプトはファイルのロックが解除されるまで待機します。

于 2013-09-30T11:39:07.373 に答える
2

スクリプトが終了すると、ロックは自動的に解除されます。ただし、手動でリリースする必要があり、自動障害が発生することに依存しないでください。例外をキャッチして処理し、ロックを解除することをお勧めします。公式ドキュメントを参照してください - http://php.net/manual/en/function.flock.php

于 2012-11-23T02:02:19.943 に答える