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

flock是否可能使用LOCK_EX返回false?

颜霖
2023-03-14

我在flock手册中找到以下描述:

默认情况下,此功能将一直阻止,直到获得请求的锁为止

在下面,我找到了以下示例代码:

<?php

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    ftruncate($fp, 0);      // truncate file
    fwrite($fp, "Write something here\n");
    fflush($fp);            // flush output before releasing the lock
    flock($fp, LOCK_UN);    // release the lock
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);

?>

但是,是否存在脚本实际返回“无法获取锁”的情况 ?我以为它会等到文件锁定。txt将被解锁。如果文件从未解锁,那么脚本将永远等待,对吗?

此外,我发现这个答案解释了unix上独占锁和共享锁的区别:https://stackoverflow.com/a/11837714/2311074这4条规则是否也适用于PHP中的flock(例如“如果已经存在一个或多个共享锁,则无法获得独占锁”)?


共有3个答案

黎奇略
2023-03-14

在SunOS上,如果以读取模式打开文件,即使文件未被锁定,带有LOCK_EX的flock也将始终返回false。PHP手册羊群页面上有对此效果的注释。该评论被否决为-2,但它是正确的,值得在此重复:

Solaris上的Flock有点奇怪:如果您试图在未打开写入的文件上获得独占锁,它将失败。也就是说,对于读取文件,您必须使用共享锁。在用于flock的Solaris手册页中:"获取共享锁需要对文件具有读取权限,获取独占锁需要具有写入权限。"相比之下,这是来自flock的Linux手册页:“用于打开文件的模式对flock来说并不重要。”所以,当心...

许多示例显示文件是以读取模式打开的,但我可以确认上面的评论。如果将flock与LOCK_EX一起使用,则如果在读取模式下打开文件,在SunOS上将返回false。由于Linux不关心您使用哪种模式,在我看来,在使用flock with LOCK_EX时,应该始终以写模式打开文件。

黄宏旷
2023-03-14

是的,我发现在构建flintstone时,它不会聚集压缩流文件。。。

$file = 'compress.zlib://path/to/file.txt';
$fp = fopen($file, 'w');
var_dump(flock($fp, LOCK_EX)); // false
公西苗宣
2023-03-14

是的,阻止flock可以返回false

如果提供的资源不支持锁定,就会发生这种情况

文件中甚至提供了样本

只能用于fopen()为本地文件返回的文件指针,或指向实现streamWrapper::stream_lock()方法的用户空间流的文件指针。

因此,如果您尝试锁定ftphttp资源,您将得到false,对于一些包装器,例如zlibphar,也会得到同样的结果。

flock()在像FAT及其派生版本这样的过时文件系统上不受支持,因此在这些环境下总是返回FALSE。

 类似资料:
  • PHP手册说,如果锁定成功,调用flock将返回TRUE,否则返回FALSE。若文件被其他进程阻塞,那个么flock应该等到它被解锁(因为我们不使用LOCK_NB)。文档中没有超时,超时会中断等待,所以显然flock将无限等待,直到获得锁为止。 但是有时我在我的多线程脚本中从flock()得到FALSE。那是什么原因呢?

  • 可选的用于表示可为空的对象,该类的一些用途包括 作为方法返回类型,作为返回null以 表示没有可用值的替代方法 区分“未知”(例如,不存在于映射中)和“已知无值”(存在于映射中,具有值 optional.缺席()) 将可为null的引用包装起来存储在不支持null的集合中(不过有几种其他方法应该首先考虑) 对于第一种情况,我是否需要在所有可为空的返回方法中返回可选的?

  • 问题内容: 寻找关于获取返回值和结果集的最干净方法的建议(不将引用的参数传递给存储的proc)。 MY存储的proc具有返回值以显示错误等,并且它们以select语句结尾以获取信息。使用常规命令,我将创建一个包含返回值的输出参数。我无法更改数据库中存储的proc,因此除了返回值之外,我无法传递其他输出参数。 想法?? 问题答案: 在LINQ to SQL DataContext设计器中通过从服务器

  • 问题内容: 如果实际查询不返回任何行,是否可以将查询中的所有列作为空列(不为null)或空行返回 问题答案: 通常,如果必须返回一个空行。 如果您的原始查询是 您可以将其变成子查询 这样可以确保查询的行数始终至少为1。

  • 或者这样会更好: 附注。抱歉开始新的话题,但我的业力不允许我评论答案。

  • 我想写一些java代码使用Spring引导消耗JSON数据从一个特定的endpoint。然而,对于每个请求,响应可能返回不同的数据字段。 等等 下面是我当前的代码,它处理第一个案例。我可以写另一个Rates.java来满足第二个案例等等,但是我希望有一个Rates.java文件来处理所有可能的案例。 LiveData。JAVA 费率。JAVA 消费Rest.java(主)