Windows与Linux上的PHP flock()行为差异

Windows与Linux上的PHP flock()行为差异,php,linux,windows,Php,Linux,Windows,我在Windows机器和Linux机器上执行相同的代码段。两者都运行PHP 5.4: $file = "lock.txt"; $fp = fopen($file, "w+"); flock($fp, LOCK_EX); var_dump(@file_put_contents($file, 'hello' . rand())); flock($fp, LOCK_UN); fclose($fp); 在Windows计算机上,file\u put\u contents()操作失败并返回false。在

我在Windows机器和Linux机器上执行相同的代码段。两者都运行PHP 5.4:

$file = "lock.txt";
$fp = fopen($file, "w+");
flock($fp, LOCK_EX);
var_dump(@file_put_contents($file, 'hello' . rand()));
flock($fp, LOCK_UN);
fclose($fp);
在Windows计算机上,
file\u put\u contents()
操作失败并返回false。在Linux机器上,它成功了

我正试图找出这两种行为中哪一种是正确的,以及如何在两个系统之间标准化行为(作为记录,我的目标是让
文件\u put\u contents()
失败。我不需要它是健壮的或原子的,我只希望它失败。)


我已经看到了很多关于这个主题的其他问题,但它们似乎都与访问同一个文件的多个脚本有关,而这里的情况并非如此。

看来
flock()
的文档确实回答了这个问题,尽管没有尽可能完整。文件中没有说明

flock()在Windows上使用强制锁定而不是建议锁定

这已经很清楚了,但是我被下面的

Flock仅使用建议锁定;也就是说,其他进程可能 完全忽略锁


我将其解释为意味着我自己的进程将隐式地尊重锁;实际上,它的意思似乎是“我们假设——一旦您首先使用
flock()
,您将记得在任何写入之前检查锁的状态,但请记住其他程序可能没有这样做。”

这两种行为都是正确的,只是它们不同而已。Windows支持文件共享模式,默认情况下,当您打开文件时,您将获得对该文件的独占访问权。Linux没有做到这一点。(请注意,flock()函数会创建一个建议锁,因此只有当
file\u put\u contents
也被称为flock()时,它才会起作用,这大概不是。)我建议您重新表述您的问题(或发布一个新问题),以关注您实际想要做的事情:锁定文件,以便在Linux上
file\u put\u contents
将失败。Windows在默认情况下做您想要做的事情,这一事实与这个问题并不相关。(谷歌搜索“linux文件锁”表明你可能运气不好,但最好还是征求专家的意见。)最终目标对我来说其实没有弄清楚到底发生了什么重要,这就是为什么我像以前那样措辞问题的原因!无论如何,我想我现在明白了。这是引自“…以一种建议的方式(这意味着所有访问程序必须使用相同的锁定方式,否则将无法工作)”