我有一個PHP進程正在寫一個文件大約每秒3次,然後幾個PHP進程正在讀取此文件的情況。Fopen文件鎖定在PHP(讀寫器類型的情況)
該文件本質上是一個緩存。我們的網站有一個非常堅持的輪詢,對於不斷變化的數據,我們不希望每個訪問者在每次輪詢時都觸及數據庫,所以我們有一個cron進程,每秒鐘讀取數據庫3次,處理數據,並將其轉儲到輪詢客戶端可以讀取的文件。
我遇到的問題是,有時打開文件寫入文件需要很長時間,有時甚至高達2-3秒。我是,假設發生這種情況是因爲它被讀取鎖定(或某些東西),但我沒有任何確鑿的證明方式,根據我從文檔中理解的內容,PHP不應該是鎖定任何東西 這種情況每2-5分鐘發生一次,所以很常見。
在代碼中,我沒有做任何類型的鎖定,我幾乎不在乎該文件的信息是否被破壞,如果讀取失敗,或者數據在讀取中發生了變化。 但是,如果寫入它需要2秒,本質上,因爲必須發生三秒鐘的過程現在跳過了幾次跳動,所以我很在意。
我在寫這個代碼的文件:
$handle = fopen(DIR_PUBLIC . 'filename.txt', "w");
fwrite($handle, $data);
fclose($handle);
而且我直接讀它:
file_get_contents('filename.txt')
(它沒有得到直接提供給客戶作爲一個靜態文件,我得到一個正常的PHP請求,讀取文件,並做了一些基本的東西)
該文件約11kb,所以它不需要很多時間來讀/寫。遠低於1ms。
這是一個典型的日誌條目當問題發生:
如果Open File: 2657.27 ms
Write: 0.05984 ms
Close: 0.03886 ms
不知道它的相關性,但在讀取發生在常規的網絡請求,通過Apache,但寫是一個普通的「命令行」 PHP的執行是由Linux的cron完成的,它不通過Apache。
有什麼想法可能會導致這個大的延遲打開文件?
任何指針,我可以看看,以幫助我查明實際原因?
或者,你可以想一些我可以做的事情來避免這種情況嗎?例如,我希望能夠設置一個50ms的超時時間來打開文件,如果它沒有打開文件,它會跳過,並讓cron的下一次運行來處理它。
再一次,我的首要任務是保持cron三秒鐘的跳動,其他都是次要的,所以任何想法,建議,任何事情都是非常受歡迎的。
謝謝!
丹尼爾
它取決於文件系統如何實現鎖定以及PHP是否尊重它們。如果您以讀取模式打開文件,則不應創建鎖定。但是,您可以用「a」替換「w」(只寫) – halfdan 2010-09-21 10:41:43
要改變追加模式避免鎖定? – 2010-09-21 10:44:43
正在寫入具有不同名稱的文件,然後將常用緩存文件名重命名爲一個選項? – 2010-09-21 10:48:47