2009-12-27 22 views
1

從我這個年齡的PHP天(幾年前)我稍微記得我有在PHP中創建日誌文件的麻煩。在隨機時間,文件突然變得空白(空白)。我曾經非常接近這樣的:如何在高頻環境中將字符串追加到錯誤日誌文件的內容中?

$myFile = "myFile.txt"; 
$fh = fopen($myFile, 'a'); 
$str = "New Entry...\n"; 
fwrite($fh, $str); 
fclose($fh); 

那真的是一種安全的方式與一個錯誤日誌文件時,也有像500級的用戶在同一時間執行PHP腳本(通過瀏覽的網站)工作?讓我們假設有一個非常糟糕的錯誤導致每個頁面視圖產生一個錯誤日誌。然後,那可憐的myFile.txt就會以每秒100次的速度被訪問。我覺得這是行不通的。我希望我錯了。

你會怎麼做?

回答

1
+0

與file_put_contents,append是原子,所以不需要LOCK_EX,如果您使用FILE_APPEND –

+0

感謝帕斯卡爾RTFM的另一個原因首先在這裏問問之前人類的記憶是如此波動:) – Gordon

+0

不客氣:-)(其實,但我會刪除LOCK_EX部分,並保留FILE_APPEND一個^^) - 關於RTFM:幾個月前,這些是互斥的事實沒有在手冊中指定(我記得關於SO ^^的一個問題) –

0

根據您的文件系統,您可能有導致丟失日誌條目的競爭條件,但總內容不應該消失。

如果您想要可靠的日誌,那麼在寫入條目之前,您必須寫入文件鎖定文件。

或者,將條目放在數據庫中。

0

使用羊羣。

還要注意(!)。

「的文件鎖定,需要一個相當現代的文件系統,如NTFS(Windows)中,EXT3/EXT4(Linux)或HFS +(蘋果機)。此外,網絡文件系統(NFS),一般用於跨UNIX服務器提供文件共享,不適合用羊羣()使用。「 http://tuxradar.com/practicalphp/8/11/0

」在許多平臺(包括大多數版本或Unix的克隆),鎖被羊羣成立( )僅僅是建議性的,這種自由裁切鎖更加靈活,但提供的保證更少,這意味着用flock()鎖定的文件可能會被不使用flock()的程序修改,Windows NT和OS/2是強制執行強制鎖定的平臺之一。詳情請向當地的文檔。」 http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perlfunc/flock.html

也許一些其他程序(或程序?)正在給你的文件...?

我還依稀記得,有些文章我看書上說,不僅在Windows或SMB網絡共享文件上使用羣集不建議,但它是越野車。

相關問題