我在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(例如“如果已经存在一个或多个共享锁,则无法获得独占锁”)?
答案 0 :(得分:2)
是的,阻止flock
可以返回false
。
如果提供的资源不支持锁定,则会发生
样本甚至在文档中提供
仅可用于fopen()返回的本地文件的文件指针, 或指向实现了 streamWrapper :: stream_lock()方法。
因此,如果您尝试锁定ftp
或http
资源,您将获得false
,对于某些包装器,例如zlib
或phar
。
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一起使用时,应该始终以写模式打开文件。