2012-01-19 103 views
5

我是PHP新手。我知道我可以使用flock()來鎖定一個文件,並避免兩個用戶到達相同的php文件時添加內容到可鎖定文件的競爭條件。如何在PHP進程/服務器崩潰時避免文件死鎖?

但是,如果一個PHP進程崩潰會發生什麼?下一位正在等待可鎖定文件的用戶會發生什麼?如果服務器崩潰(有人拔插頭)會發生什麼?鎖是否自動釋放?重新啓動服務器後文件是否會保持鎖定狀態?

爲了簡短起見,PHP是否確保這些危急情況(即鎖定沒有明確發佈)得到正確處理?如果不是,應該如何處理這些情況?如何從這些恢復?

回答

5

鎖由OS處理。因此:

  • 如果一個進程崩潰,它持有的所有鎖都被釋放(以及任何其他類型的資源其持有)
  • 如果系統崩潰,鎖是毫無意義的,因爲它們沒有「結轉」到下次重啓

除了使用操作系統提供的鎖定文件的機制之外,PHP不需要做任何特殊的事情,所以一般來說,你是完全安全的。

然而,如果你的Web服務器的設置是這樣的:每個請求不被新的工藝處理,那麼如果有一個請求被異常終止(比方說,一個線程中止)門鎖會持續存在,阻止所有的進一步請求鎖定,很快導致死鎖的Web服務器。這是很多原因之一,你真的不應該使用不會在請求之間提供進程級隔離的設置(免責聲明:我不是Web服務器專家 - 我可能在「不應該」部分出錯,即使我懷疑它)。