首页 > 解决方案 > 当两个脚本要同时在一个带有 LOCK_EX 的文件上写入时会发生什么?

问题描述

如果 PHP 脚本想要:

file_put_contents("testfile", $s, FILE_APPEND | LOCK_EX);

而另一个脚本已经在同一个文件上做了同样的事情(LOCK_EX也有)?

不太可能发生 2 个脚本想要在同一毫秒内完全写入(对于 < 100 kB 的文件),但让我们想象一下它会发生。

函数会file_put_contents注意到它被锁定,等待 10 毫秒然后重试,还是 PHP 脚本失败,要写入的数据丢失?

标签: phpfileiofile-put-contents

解决方案


两个进程flock()在开始写入之前都会调用以锁定文件。第一个将获得锁,第二个将等到文件解锁。没有重试,它由操作系统自动处理。文档没有提到超时,所以我认为没有。

第一个进程将在完成写入后立即解锁文件,然后第二个进程将运行。

LOCK_EX如果您使用FILE_APPEND. 每次调用write()都是原子的,当文件以附加模式打开时,文件系统确保每个进程都在新的文件末尾写入,而不是在打开文件时写入 EOF 位置。


推荐阅读