同步文件访问
回答
小规模的文件操作非常快,以致在同一时间两次写入操作相当罕见。无论如何,你可以使用flock
锁定文件:
$fp = fopen('file.log', 'a+');
flock($fp, LOCK_EX);
fwrite($fp, 'my data');
flock($fp, LOCK_UN);
fclose($fp);
注意fclose
自动解锁文件,但我发现它使代码多一点人性化的把这些东西
+1,简洁......不像我的华夫饼! – 2010-01-14 23:01:28
如果解释器锁定文件,但在解锁之前服务器会死机,所以它不会被解锁? – ajsie 2010-01-14 23:02:00
@noname - Yup。锁定系统通常必须进行仲裁,达成共识并处理这些事情。 – 2010-01-14 23:05:07
是的,你可以同时打开两个文件,除非你锁定文件[flock]。然而,将文件植入文件的最佳时间是在写入文件时,或者如果您选择只允许一个用户在任何一个点上查看文件。
最重要的是:当他们写
- 会发生什么,如果(一)读会发生什么事,(B),然后读取(B),然后写道:(a)书写? (a)的写入无效,因为它的计算不再来自最新状态?
典型的例子是在许多文本使用的Cash machine/bank balance例子。
任何种共享可写状态需要某种形式的并发访问控制诸如mutex的,但也有吨潜在问题,例如race conditions,饥饿和对dining philosophers problem变化。
然而,许多操作系统允许File locking的一些说明,这意味着另一个进程等待锁释放。请参阅PHP's flock() for locking a file.
您也可以使用“检出,更改,提交/合并”方法。
根据你的原因,你可能要考虑一个数据库,如MySQL或SQLite因为这些将提供更快,更稳健的方式来分享其读取重或不带cache的状态。
分享状态的诸多问题,陷阱和方式非常多。所有维基百科用法的道歉。
所有时间都会发生。但是,您的问题的答案取决于准确/想要对打开的文件做什么。可能的行动/解决方案纯粹取决于这一要求。
。使用file_put_contents()
而不是FILE_APPEND
或LOCK_EX
标志。
任何这些标志锁定文件以进行写入。
- 1. 同步访问ArrayList
- 2. 访问电子邮件同步设置
- 3. Vulkan:vkWaitForFences同步访问VkDevice
- 4. 同步访问UITableViewDelegate逻辑
- 5. 同步访问返回值
- 6. 如何同步访问indexedDB?
- 7. 访谈问:Java同步
- 8. 同步对SimpleDateFormat的访问
- 9. 同步数据访问
- 10. Java CDI @ApplicationScoped同步/异步访问
- 11. 同时访问db4o文件
- 12. PHP文件同时访问
- 13. 跨进程的File.Exists()和文件访问同步
- 14. 同步更新公共文件的进程间访问
- 15. PHP同时文件访问/ flock()问题
- 16. 在文件上同步写入不同的异常和访问被拒绝
- 17. “同步访问线程”与“同步共享对象”相反吗?
- 18. 文件同步库
- 19. 同步skydrive文件
- 20. 访问java中的同步方法
- 21. Java:多线程链表访问同步
- 22. GAE中的列表访问同步
- 23. 偶尔EXC_BAD_ACCESS在NSUserDefaults访问或同步
- 24. 使用SyncLock同步访问List of(T)
- 25. 同步访问数据库和MySQL
- 26. 多线程访问同步语句
- 27. 同步访问ASP.NET会话的成员
- 28. 同步访问常见数据
- 29. 从不同目录访问文件
- 30. AWS S3:访问,同时上传文件
我不确定确切的答案。但是,有人试过这个。 – 2010-01-14 22:43:42
也取决于操作系统。 – 2010-01-14 22:55:02
这几乎是MySQL 3.x在web开发初期变得如此流行的全部原因。 – 2010-01-14 23:31:32