2011-12-07 46 views
1

據我瞭解,當您通過flock($handle, LOCK_EX)向用戶授予對文件的獨佔鎖定時,您會阻止其他人在文件發佈前寫入文件。PHP:你能讀取一個獨佔鎖的文件嗎?

但是,其他人是否仍然可以打開共享鎖來從文件中讀取? e,g,flock($handle, LOCK_SH)

這是一個平面文件數據庫系統,我希望人們仍然可以查詢數據庫是否有人正在寫入數據庫,但是會阻止多個人立即寫入數據庫。

+0

你測試過了嗎?你剛纔概述了*這可以被測試 - 所以去做吧! – DaveRandom

+0

@DaveRandom將需要多臺機器,看看我將如何擁有排他鎖。 –

+0

它不需要多臺機器,只需多個進程。只要打開另一個終端... – DaveRandom

回答

0

使用「file_get_contents」的文件讀取忽略任何文件鎖定。在實踐中,「file_get_contents」會讀到文件的末尾(如果你在那時寫信給它,它會讀取它可以得到並返回的內容)。

使用「fread」或「fgets」的文件讀取會執行相同的操作,但您可以先使用「flock」確保文件未被鎖定,但仍有機會出現賽車狀況。

你實際上面臨的最大問題是,並非所有的Linux服務器將支持它的「羊羣」使用系統調用是在一些服務器上「諮詢」,因此簡單地忽略(通過不鎖定任何文件)。這就是像SQLite或MySQL這樣的數據庫服務器通過提供自己的鎖定機制進入的地方,這些鎖定機制不依賴於服務器,並且 - 大多數情況下 - 在避免可能會破壞平面文件數據庫的競爭條件時更聰明。