2011-12-04 62 views
0

將舊內容讀入$content,然後將$string . $content寫回文件中:不工作,新消息打印在文件末尾。爲什麼我不能在我的日誌文件中添加一行?

相關方法在Logger類:

public function __construct($filename) 
{ 
    $this->filename = $filename; 
    $this->fp = fopen($this->filename, "w+"); 

    if (!$this->fp) throw new Exception("Errore nel file: " . $this->filename); 
} 

protected function log($severity, $message) 
{ 
    $string = sprintf("[%s] (%s): %s", $severity, date('d/m/Y H:i:s'), $message); 
    $content = !filesize($this->filename)? '' : 
     fread($this->fp, filesize($this->filename)); 

    fwrite($this->fp, $string . $content . "\n"); 

    return $message; 
} 
+1

我建議你在文件中像每一個末尾添加您的留言其他記錄器和使用@mario解決方案 – dynamic

+0

可能重複[如何預先開始文件?](http://stackoverflow.com/quest離子/ 3332262 /如何做我prepend文件開始) – mario

+1

你**真的不應該prepend到日誌文件**。它需要每次重寫**整個**文件。如果您只想簡單地查看最新的日誌條目,則可以始終使用shell上的「tail」程序獲取最後N行。 – ThiefMaster

回答

2

進行日誌記錄,你應該使用:

file_put_contents($filename, $content, FILE_APPEND|LOCK_EX); 

這不僅更少的代碼,但也需要鎖定的文件(沒有併發訪問的關懷和覆蓋附加內容)。

+2

這將追加該行。據我所知,他希望預先支付。 – favoretti

+0

這就是我使用的。這就是爲什麼我喜歡php – dynamic

+0

@favoretti:好吧,我剛剛問題標題。儘管如此,預先配置並不可取。這不是操作系統文件系統funcs的優化。我寧願*僅用於顯示*用'tac'或者'array_reverse(file($ log))'讀取文件,而不是減慢日誌記錄速度或者爲此寫入精心設計的代碼。 (他仍然需要鎖定。) – mario

0

如何:

$contents = file_get_contents($file); 
$contents = $string . $contents; 
... fwrite(); 
+0

雖然您的代碼*可以*工作,但我會在任何由我控制的項目中完成此任務的開發人員。重寫一個潛在巨大的日誌文件是你永遠不想做的事情。不幸的是,如果預先確定這個人真正想要的是什麼,那就別無他法。 – ThiefMaster

+0

除此之外,對吧? :)他想要預先安排,這是做到這一點的方法之一。問題中沒有任何地方設置其他約束,如日誌文件的大小或任何東西:) – favoretti

+0

@ThiefMaster:對不起,忘了標記你。 – favoretti

0

嘗試與這一個替換此代碼

$this->fp = fopen($this->filename, "w+"); 

$this->fp = fopen($this->filename, "a+"); 
相關問題