我在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()
,你会记得在写入之前检查锁的状态,但要记住其他程序可能不会这样做“。