当两个脚本想要同时写入一个文件 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 位置。
如果 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 位置。