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

我在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_put_contents()操作失败并返回false。 在Linux机器上,它成功了。

我试图找出这两个行为中的哪一个是真正正确的,以及如何在两个系统之间标准化行为(为了logging,我的目标是让file_put_contents()失败。我不需要它是强壮的或primefaces,我只是希望它失败。)

我已经看到很多其他关于这个话题的问题,但是他们似乎都涉及到访问同一个文件的多个脚本,这不是这里的情况。

看来flock()的文档确实回答了这个问题,尽管并不尽如人意。 文档确实如此

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

这足够清楚了,但是我被第一条评论所抛弃了

Flock只使用ADVISORY锁定; 也就是说, 其他进程可能完全忽略该锁

我是在解释这一点,意思是我自己的过程会隐含地尊重锁定。 实际上,它似乎是这样的:“我们假设 – 一旦你首先使用flock() ,你会记得在写入之前检查锁的状态,但要记住其他程序可能不会这样做“。