php - 当两个脚本要同时在一个带有 LOCK_EX 的文件上写入时会发生什么?
问题描述
如果 PHP 脚本想要:
file_put_contents("testfile", $s, FILE_APPEND | LOCK_EX);
而另一个脚本已经在同一个文件上做了同样的事情(LOCK_EX
也有)?
不太可能发生 2 个脚本想要在同一毫秒内完全写入(对于 < 100 kB 的文件),但让我们想象一下它会发生。
函数会file_put_contents
注意到它被锁定,等待 10 毫秒然后重试,还是 PHP 脚本失败,要写入的数据丢失?
解决方案
两个进程flock()
在开始写入之前都会调用以锁定文件。第一个将获得锁,第二个将等到文件解锁。没有重试,它由操作系统自动处理。文档没有提到超时,所以我认为没有。
第一个进程将在完成写入后立即解锁文件,然后第二个进程将运行。
LOCK_EX
如果您使用FILE_APPEND
. 每次调用write()
都是原子的,当文件以附加模式打开时,文件系统确保每个进程都在新的文件末尾写入,而不是在打开文件时写入 EOF 位置。
推荐阅读
- r - 在大型数据集上加速 st_crop(sf 包)的方法
- vb.net - Mat to Bitmap converter - Argument Exception
- django - 未显示 Django REST Framework 多个 OR'd 自定义权限的消息
- php - 如何将默认日期值设置为“日期”类型的输入?
- java - 在 gremlin 服务器脚本文件中使用自定义库
- mysql - 是否可以在不重新启动 mysql 的情况下修改 logrotate 路径?
- android - 从 Android Gradle 访问 Azure DevOps 变量
- networking - Ubuntu 18.04(ESXi 6.7 上的来宾)中随机时间后的接口阻塞连接
- javascript - Chrome 上下文菜单扩展:将选定的文本保存到变量中
- r - 哪种是按列值聚合行(总和)的最简单方法是 R 上以下类型的数据框?