同步文件訪問
回答
小規模的文件操作非常快,以致在同一時間兩次寫入操作相當罕見。無論如何,你可以使用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. 同步訪問文件
- 2. .net文件訪問同步
- 3. 同步訪問
- 4. 同步訪問ArrayList
- 5. 基於每個文件訪問文件的同步
- 6. 不能放浪同步文件夾內訪問文件
- 7. C++文件同步問題
- 8. 訪問電子郵件同步設置
- 9. F#同步訪問列表
- 10. 訪談問:Java同步
- 11. 同步數據庫訪問
- 12. Vulkan:vkWaitForFences同步訪問VkDevice
- 13. 同步訪問UITableViewDelegate邏輯
- 14. 同步對SimpleDateFormat的訪問
- 15. 同步數據訪問
- 16. 同步訪問JPA EntityManager
- 17. 同步訪問返回值
- 18. 如何同步訪問indexedDB?
- 19. Java CDI @ApplicationScoped同步/異步訪問
- 20. 同時訪問db4o文件
- 21. PHP文件同時訪問
- 22. 如何使用java同步對文件夾的訪問?
- 23. 跨進程的File.Exists()和文件訪問同步
- 24. 從兩個或多個Servlet同步訪問一個文件
- 25. 同步更新公共文件的進程間訪問
- 26. Linux中'n'進程之間的文件訪問(讀/寫)同步
- 27. PHP同時文件訪問/ flock()問題
- 28. 在文件上同步寫入不同的異常和訪問被拒絕
- 29. 「同步訪問線程」與「同步共享對象」相反嗎?
- 30. SQL Azure數據同步 - 如何訪問數據同步的API?
我不確定確切的答案。但是,有人試過這個。 – 2010-01-14 22:43:42
也取決於操作系統。 – 2010-01-14 22:55:02
這幾乎是MySQL 3.x在web開發初期變得如此流行的全部原因。 – 2010-01-14 23:31:32