当两个脚本想要同时写入一个文件 LOCK_EX 时会发生什么?

What happens when two scripts want to write at the same time on a file with LOCK_EX?

如果 PHP 脚本想要:

会发生什么
file_put_contents("testfile", $s, FILE_APPEND | LOCK_EX);

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

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

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

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

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

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