7

このコードを 2 回実行する:

$fp = @fopen('test.test', "wb");

    if (flock($fp, LOCK_NB | LOCK_EX)){
                @fwrite($fp, $data);
                echo 'written';
                sleep(5);
    }else{
        echo 'skipped , ok';
    }

    @flock($fp, LOCK_UN);
    @fclose($fp);

常に「書かれた」という出力が得られます

がスキップされたことを意味し、LOCK_NB手がかりがあれば (winbdows と unix の両方で)

編集 (2012-03-29 まだ修正されていません): https://bugs.php.net/bug.php?id=54453&edit=3 PHP バグ #54453

4

2 に答える 2

20

Apache+PHP を使用しているときに、だまされて LOCK_NB が無視されたと信じ込まされました (そうではなく、ブラウザが最初のリクエストの終了を待っていたためです)。

同じブラウザーで 2 つの要求を行っていたため、ブラウザーは次の呼び出しを行う前に最初の呼び出しが完了するのを待っていました (「Connection: close」ヘッダーを無視しても)。

2 つの別個のブラウザー (私の場合は Chrome + Firefox、またはサーバー上の Chrome + wget) を使用して、LOCK_NB は問題なく機能すると結論付けました。

w+ モードのファイルが LOCK_EX | でロックされている場合。LOCK_NB、別の LOCK_EX を試行 | 同じファイルの LOCK_NB は false を返しました (意図した動作)。

于 2012-03-22T17:13:29.617 に答える
0

LOCK_NB は次の場合にのみ機能します。

  1. ファイルがロックされてLOCK_SHいるときに、LOCK_EX|LOCK_NB
  2. ファイルがロックされてLOCK_EXいるときに、LOCK_SH|LOCK_NB

次の場合、LOCK_NB は無視されます。

  1. ファイルがロックされてLOCK_EXいるときに、LOCK_EX|LOCK_NB
  2. ファイルがロックされてLOCK_SHいるときに、LOCK_SH|LOCK_NB

これはバグだと思いますか?それとも LOCK_NB2 を作成する必要がありますか? これをバグとして PHP.NET に報告しました。

編集 (2012-03-22 まだ修正されていません): https://bugs.php.net/bug.php?id=54453&edit=3 PHP バグ #54453

于 2011-04-04T14:18:14.920 に答える