我正在研究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下运行它。
答案 0 :(得分:16)
LOCK_SH表示共享锁定。任何数量的进程可能都有共享 同时锁定。它通常被称为读卡器锁。
LOCK_EX表示EXCLUSIVE LOCK。只有一个过程可能拥有一个 对一个给定文件的独占锁定。
如果文件已在另一个进程中与LOCK_SH锁定,则flock 与LOCK_SH将成功。与LOCK_EX一起群将阻止直到全部 阅读器锁已经发布。
答案 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($)