【问题标题】:It is possible that flock returns false with LOCK_EX?LOCK_EX 可能会返回 false 吗?
【发布时间】:2017-01-03 12:13:52
【问题描述】:

我在flock manual找到了如下描述:

默认情况下,此函数将阻塞,直到请求的锁被 获得

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

<?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);

?>

但是在任何情况下脚本实际上会返回"Couldn't get the lock!"?我认为它要等到文件lock.txt 被解锁。如果文件永远不会被解锁,那么脚本会一直等待,对吧?

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

【问题讨论】:

  • 我可以想象在其他情况下该函数可能会返回 FALSE,例如句柄无效或文件系统不支持锁定或类似情况。
  • 手册中还提到了一个 LOCK_NB 位掩码值,它使flock 非阻塞。

标签: php


【解决方案1】:

是的,阻止flock 可以返回false

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

文档中甚至提供了示例

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

因此,如果您尝试锁定 ftphttp 资源,您将获得 false,同样适用于某些包装器,例如zlibphar

flock() 不支持过时的文件系统,如 FAT 及其 派生类,因此在这些情况下将始终返回 FALSE 环境。

【讨论】:

    【解决方案2】:

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

    $file = 'compress.zlib://path/to/file.txt';
    $fp = fopen($file, 'w');
    var_dump(flock($fp, LOCK_EX)); // false
    

    【讨论】:

      【解决方案3】:

      在 SunOS 上,如果您以读取模式打开文件,带有 LOCK_EX 的flock 将始终返回false,即使文件未锁定。 PHP Manual flock page 上对此效果有评论。该评论被否决为-2,但它是正确的,值得在这里重复:

      在 Solaris 上的 flock 有点奇怪:如果你试图获得一个没有打开写入的文件的排他锁,它会失败。也就是说,为了读取文件,您必须使用共享锁。来自flock 的Solaris 手册页:“文件需要读取权限才能获得共享锁,而需要写入权限才能获得排他锁。”相比之下,这是来自flock 的Linux 手册页:“用于打开文件的模式与flock 无关。”所以,小心……

      许多羊群示例显示文件以读取模式打开,但我可以确认上述评论。如果您将flock 与LOCK_EX 一起使用,如果您以读取模式打开文件,它将在SunOS 上返回false。由于 Linux 并不关心您使用哪种模式,因此在我看来,当使用带有 LOCK_EX 的flock 时,应该始终以写入模式打开文件。

      【讨论】:

        猜你喜欢
        • 2012-09-17
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        • 2014-04-01
        • 1970-01-01
        • 2021-11-20
        • 2019-01-05
        • 1970-01-01
        相关资源
        最近更新 更多