2010-01-14 35 views
7

使用:如果兩個用戶試圖打開相同的文件在同一時間同步文件訪問

fopen 
fwrite 
fclose 

會發生什麼?

+4

我不確定確切的答案。但是,有人試過這個。 – 2010-01-14 22:43:42

+0

也取決於操作系統。 – 2010-01-14 22:55:02

+1

這幾乎是MySQL 3.x在web開發初期變得如此流行的全部原因。 – 2010-01-14 23:31:32

回答

6

小規模的文件操作非常快,以致在同一時間兩次寫入操作相當罕見。無論如何,你可以使用flock鎖定文件:

$fp = fopen('file.log', 'a+'); 
flock($fp, LOCK_EX); 
fwrite($fp, 'my data'); 
flock($fp, LOCK_UN); 
fclose($fp); 

注意fclose自動解鎖文件,但我發現它使代碼多一點人性化的把這些東西

+0

+1,簡潔......不像我的華夫餅! – 2010-01-14 23:01:28

+0

如果解釋器鎖定文件,但在解鎖之前服務器會死機,所以它不會被解鎖? – ajsie 2010-01-14 23:02:00

+0

@noname - Yup。鎖定系統通常必須進行仲裁,達成共識並處理這些事情。 – 2010-01-14 23:05:07

1

是的,你可以同時打開兩個文件,除非你鎖定文件[flock]。然而,將文件植入文件的最佳時間是在寫入文件時,或者如果您選擇只允許一個用戶在任何一個點上查看文件。

3

最重要的是:當他們寫

    1. 會發生什麼,如果(一)讀會發生什麼事,(B),然後讀取(B),然後寫道:(a)書寫? (a)的寫入無效,因爲它的計算不再來自最新狀態?

    典型的例子是在許多文本使用的Cash machine/bank balance例子。

    任何種共享可寫狀態需要某種形式的併發訪問控制諸如mutex的,但也有噸潛在問題,例如race conditions,飢餓和對dining philosophers problem變化。

    然而,許多操作系統允許File locking的一些說明,這意味着另一個進程等待鎖釋放。請參閱PHP's flock() for locking a file.

    您也可以使用「檢出,更改,提交/合併」方法。

    根據你的原因,你可能要考慮一個數據庫,如MySQLSQLite因爲這些將提供更快,更穩健的方式來分享其讀取重或不帶cache的狀態。

    分享狀態的諸多問題,陷阱和方式非常多。所有維基百科用法的道歉。

  • 1

    所有時間都會發生。但是,您的問題的答案取決於準確/想要對打開的文件做什麼。可能的行動/解決方案純粹取決於這一要求。

    3

    。使用file_put_contents()而不是FILE_APPENDLOCK_EX標誌。

    任何這些標誌鎖定文件以進行寫入。