2015-07-10 81 views
1

訪問者登錄我的一個網站剛剛失去了所有訪客。它已經工作了一年半,但所有參賽作品都在一夜之間失去了。日誌頁面在這裏(如果您訪問其中一個網站頁面,您的信息將被添加到日誌中): http://mykindred.com/dalton/hoax/viewlog.php極限數組長度 - 失敗?

日誌保存在文本文件($ filename)中,該文本文件應該限制爲$ maxloglines = $ logline包含要添加到日誌中的新訪問者。生成日誌的代碼:

$lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 
$logline .= implode("\n", array_slice($lines, 0, $maxloglines)); 
file_put_contents($filename, $logline); 

有關爲什麼我的日誌會丟失其條目的任何建議?我有編碼錯誤嗎?

+0

您記錄的內容可能是否有額外的換行符?文件是完全清空還是有300個空行? – davids3

+0

你有可能在寫作時嘗試閱讀嗎?您應該鎖定文件以防止出現這種情況。查看關於'c'模式的註釋: http://php.net/manual/en/function.fopen.php –

+0

@ davids3顯示的代碼刪除空行,並且日誌已滿昨天(即有300個條目) 。 – tcloud

回答

0

當使用file_put_contents寫入文件,你基本上是利用將文件打開與文件模式w一系列fopen()fwrite()fclose()

寫入方式打開;將文件指針放在 文件的開頭,並將文件截斷爲零。如果文件不存在, 會嘗試創建它。

由於對文件沒有排它鎖,因此可以在文件已被截斷並且文件指針位於開始位置的位置讀取該文件。在這種情況下,您的file()命令的內容將爲空。

相反,你應該使用選項LOCK_EX,以確保文件的獨佔鎖,而寫:

file_put_contents($filename, $logline, LOCK_EX); 

您可以在flock()文檔中閱讀更多關於這一點。