10

我正在研究 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 下运行它。

4

3 回答 3

19

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

LOCK_EX 表示排他锁。一次只有一个进程可以拥有对给定文件的排他锁。

如果文件已在另一个进程中使用 LOCK_SH 锁定,则使用 LOCK_SH 的集群将成功。带有LOCK_EX 的flock 将阻塞,直到所有读者锁都被释放。

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

于 2013-12-08T10:50:53.450 回答
7

flock()实现咨询锁定,而不是强制锁定。为了file2.phpfile1.php's 的锁阻塞,它需要在写入之前尝试(LOCK_EX)在文件上获取一个写锁。

于 2013-12-08T10:49:31.033 回答
-1

我们使用 LOCK_SH 来读取文件。如果此时此文件中写入了某些内容,则此类型阻塞等待完成操作写入,然后解锁,我们可以读取 .
如果此文件中没有写入的内容被锁定,请不要设置!

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