使用LOCK_EX,flock可能返回false?

时间:2017-01-03 12:13:52

标签: php

我在flock manual处找到了以下说明:

  

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

下面我发现了以下示例代码:

SELECT requestdate, requestdate + (lt_weeks||' weeks')::interval
  FROM table_1;

但是有任何情况下脚本实际上会返回<?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!"解锁。如果文件永远不会被解锁,那么脚本会永远等待,对吧?

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

3 个答案:

答案 0 :(得分:2)

是的,阻止flock可以返回false

如果提供的资源不支持锁定,则会发生

样本甚至在文档中提供

  

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

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

  

flock()在陈旧的文件系统(如FAT及其文件系统)上不受支持   派生,因此在这些条件下始终返回FALSE   环境。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

Solaris上的

flock有点奇怪:如果尝试对未打开但无法写入的文件进行排他锁,它将失败。也就是说,对于读取文件,您必须使用共享锁。在Solaris flock的手册页中:“文件的读取权限需要获得共享锁,而文件排他的权限则需要获得写锁。”相比之下,这是来自Linux手册页中的flock:“用于打开文件的模式与flock无关紧要。”所以,当心...

许多群集示例显示了以读取模式打开文件,但是我可以确认上面的注释。如果将flock与LOCK_EX一起使用,则在以读取模式打开文件时,它将在SunOS上返回return false。由于Linux不在乎您使用哪种模式,因此在我看来,在将LOCK_EX与flock一起使用时,应该始终以写模式打开文件。