2012-10-19 67 views
2

我想要更新文件,而其他進程可能正在使用它閱讀。 PHP flock()函數允許完全做到這一點。有效的文件更新與羊羣和移動

然而,正如我看到羊羣只需要一個文件句柄..通常來自fopen。如果我想有效地做到這一點,我不想保持文件打開並寫入文件,因爲文件通過網絡傳輸,寫操作可能會跨越幾秒鐘(例如2-3秒)。

所以我希望能夠將數據寫入臨時文件然後移動它。在這種情況下,只有在重命名文件時,文件的讀者纔會感到不安。

現在將數據寫入temp不需要我使用羣集。然而,我怎樣才能使用鎖定將tempfile移動到實際文件中。

我也想知道我是否真的需要鎖定在第一位..移動操作不會很快嗎?會傷害同時讀取文件嗎?我預計將有100個讀取,但只有一個更新,並且該更新每小時發生一次

回答

3

重命名在POSIX系統中是原子的,因此您不需要羣集。已經打開文件的讀者將不受干擾。 (理由:一個打開的文件句柄指向索引節點,而不是目錄條目,重命名只改變目錄條目。)

但是,讀者必須關閉並重新打開文件才能獲取新內容。如果讀者保持文件打開,他們將能夠重新讀取舊內容。