当前位置: 首页 > 知识库问答 >
问题:

LOCK_SH如何工作?

于正志
2023-03-14

我正在学习PHP中的flock mecanism,我很难理解LOCK_SH模式的功能。我在一个网站上读到,它会锁定文件,以便其他脚本无法在其中写入,但它们可以从中读取。但是,以下代码似乎没有按预期工作:在file1中。我有:

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

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

在文件2中。我有

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

我运行第一个锁定文件20秒的脚本。锁定到位后,我运行file2.php立即完成它的执行,之后,当我打开'my_file.txt'时,字符串'test'被附加到它(尽管'file1.php'仍在运行)。我试图改变'file2.php',以便它将从锁定的文件中读取,并从它红色没有问题。很明显...LOCK_SH什么都不做。但是,如果我使用LOCK_EX是,它会锁定文件,没有脚本可以从文件中写入或读取。我使用简单的PHP并在Windows 7下运行它。

共有3个答案

岳嘉良
2023-03-14

我们使用LOCK_SH读取文件。如果有东西在这个文件中写入,在这个时候这个类型阻塞等待完成操作写入,然后解锁,我们可以读取
如果此文件中没有写入的内容被锁定,请不要设置!

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

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

计向晨
2023-03-14

LOCK_SH意味着共享锁。任意数量的进程可能同时具有共享锁。它通常被称为读取器锁。

LOCK_EX表示独占锁。一次只能有一个进程拥有对给定文件的独占锁。

如果文件在另一个进程中被LOCK_SH锁定,具有LOCK_SH的flock将成功。具有LOCK_EX的flock将阻塞直到释放所有读取器锁。

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

 类似资料:
  • 问题内容: 我对如何使用动作监听器和实现它们有一个想法,但是我想知道是否有人可以告诉我他们如何监听事件?有某种轮询机制吗? 问题答案: 动作侦听器使用观察者模式注册事件,主事件循环会将它们注册的所有事件通知它们。所以不,这不是轮询(拉)机制,而是相反的(推)回调。这是“不给我们打电话,我们给您打电话”编程的一个例子。因为代码中的所有内容都在单个线程(事件循环)上运行,所以您不必担心不同事件之间的同

  • 问题内容: 我试图了解Collections.binarySearch如何在Java中工作。我不太明白我得到的输出。 此代码的输出为-1。 当按此顺序插入元素时 结果是0。我认为如果找不到该元素,则结果为负数。有人可以澄清我收到的输出吗? 问题答案: 您的数据必须根据给定的比较器进行排序,以使二进制搜索能够按预期工作。(如果不是,则行为是不确定的。) 在进行此调用之前,必须根据指定的比较器(通过方

  • 问题内容: 我正在尝试了解linux syscallsched_setaffinity()的工作方式。这是我在这里提出的问题的后续。 我有本指南,该指南说明了如何使用syscall并有一个非常简洁(工作!)的示例。 因此,我下载了Linux 2.6.27.19 内核源代码。 我对包含该系统调用的行进行了“ grep”操作,得到了91个结果。没有希望。 最终,我试图了解内核如何 为特定内核 (或处理

  • 问题内容: 我刚刚了解到。它用于动态加载扩展的驱动程序。然后我们得到使用方法的连接。 那么整个事情如何运作? DriverManager类如何知道如何在不使用实际驱动程序的类名的情况下获取连接。 我们也可以将Class.forName()用于自定义应用程序…如果通过示例进行解释,我将非常高兴。 问题答案: 只需加载一个类,包括运行其静态初始化程序,如下所示: 您正在谈论的所有其余过程都是特定于JD

  • 问题内容: ArrayList在内部使用什么数据结构? 问题答案: 内部使用。 在向中添加项目时,列表会检查后备阵列是否还有剩余空间。如果有空间,则将新项目添加到下一个空白处。如果没有空间,则会创建一个更大的新阵列,并将旧阵列复制到新阵列中。 现在,还有更多空间,新元素将添加到下一个空白空间。 由于人们真的很喜欢源代码: 直接跳出JDK。

  • 问题内容: 为了清楚起见,我试图找出Collections.sort(list,new MyComp())方法如何按顺序调用compare方法。 我有一个带有雇员及其个人号码(k)的LinkedList:这些号码是:{1,2,3,4,5,6} MyComparator中的compare(Object o1,Object o2)方法返回一些数字(即与该问题无关)。sort()如何比较方法?它使用参数