LOCK_SH如何工作?

时间:2013-12-08 10:41:15

标签: php flock

我正在研究PHP中的群体机制,我很难理解LOCK_SH模式的功能。我在一个网站上读到它锁定文件,以便其他脚本不能写入,但他们可以从中读取。但是,以下代码似乎没有按预期工作:在file1.php中我有:

$fp = fopen('my_file.txt','r');

flock($fp, LOCK_SH);
sleep(20);
flock($fp, LOCK_UN);

在file2.php我有

$fp = fopen('my_file.txt','a');
fwrite($fp,'test');

我运行第一个锁定文件20秒的脚本。在锁定到位的情况下,我运行file2.php,它立即完成执行,之后,当我打开'my_file.txt'时,字符串'test'被附加到它上面(虽然'file1.php'仍在运行)。我尝试更改'file2.php',以便它可以从锁定的文件中读取并从中红色,没有任何问题。所以 显然......'LOCK_SH'接缝什么也不做。但是,如果我使用LOCK_EX是,它会锁定文件,没有脚本可以写入或读取文件。我正在使用Easy PHP并在Windows 7下运行它。

3 个答案:

答案 0 :(得分:16)

  

LOCK_SH表示共享锁定。任何数量的进程可能都有共享   同时锁定。它通常被称为读卡器锁。

     

LOCK_EX表示EXCLUSIVE LOCK。只有一个过程可能拥有一个   对一个给定文件的独占锁定。

     

如果文件已在另一个进程中与LOCK_SH锁定,则flock   与LOCK_SH将成功。与LOCK_EX一起群将阻止直到全部   阅读器锁已经发布。

http://php.net/manual/en/function.flock.php#78318

答案 1 :(得分:4)

flock()实现建议锁定,而非强制锁定。为了file2.php锁定file1.php,它需要在写入之前尝试获取文件的(LOCK_EX)锁。

答案 2 :(得分:0)

我们使用LOCK_SH读取文件。 如果这次在此文件中写入了某些内容,则此类型的阻塞等待完成操作将写入并且在解锁之后,我们可以读取。
如果此文件中没有写任何内容,则不要设置!

 <?php ## Модель процесса-читателя
    $file = "file.txt";
    // Вначале создаем пустой файл, ЕСЛИ ЕГО ЕЩЕ НЕТ.
    // Если же файл существует, это его не разрушит.
    fclose(fopen($file, "a+b"));
    // Блокируем файл
    $f = fopen($file, "r+b") or die("Не могу открыть файл!");
    flock($f, LOCK_SH); // ждем, пока не завершится писатель
    // В этой точке мы можем быть уверены, что в файл
    // никто не пишет
    // Все сделано. Снимаем блокировку.
    fclose($)