2009-12-27 59 views
1

我發現了一個logging script這樣的:我是否必須明確關閉此文件?

/** 
* Logging class: 
* - contains lopen and lwrite methods 
* - lwrite will write message to the log file 
* - first call of the lwrite will open log file implicitly 
* - message is written with the following format: hh:mm:ss (script name) message 
*/ 
class Logging{ 
    // define log file 
    private $log_file = '/tmp/logfile.txt'; 
    // define file pointer 
    private $fp = null; 
    // write message to the log file 
    public function lwrite($message){ 
    // if file pointer doesn't exist, then open log file 
    if (!$this->fp) $this->lopen(); 
    // define script name 
    $script_name = pathinfo($_SERVER['PHP_SELF'], PATHINFO_FILENAME); 
    // define current time 
    $time = date('H:i:s'); 
    // write current time, script name and message to the log file 
    fwrite($this->fp, "$time ($script_name) $message\n"); 
    } 
    // open log file 
    private function lopen(){ 
    // define log file path and name 
    $lfile = $this->log_file; 
    // define the current date (it will be appended to the log file name) 
    $today = date('Y-m-d'); 
    // open log file for writing only; place the file pointer at the end of the file 
    // if the file does not exist, attempt to create it 
    $this->fp = fopen($lfile . '_' . $today, 'a') or exit("Can't open $lfile!"); 
    } 
} 

我看不到任何文件,這裏關閉代碼。這很好嗎?如果不是,那麼在什麼時候適合?或者腳本完全執行完畢後,PHP是否會關閉該文件?

回答

1

正如人們所說,PHP會自動關閉文件。但是,關閉文件是最佳實踐。

  1. 在大多數語言中,您必須明確關閉文件,否則可能會導致數據丟失。所以這是一個很好的習慣,如果你曾經移植過你的應用程序,那麼這很有幫助。

  2. 數據可能無法刷新到磁盤,直到關閉發生。如果你的腳本運行了一段時間(作爲PHP腳本,它可能不會),那麼你可能想要更明確地控制什麼時候寫入東西。對於我的「典型」日誌記錄應用程序,我打開並關閉每一行上的文件,以便在發生崩潰時保存日誌。

  3. 最重要,也是被忽視的:它阻止下一個人不得不再次問這個問題!這是一個代碼清晰度問題;如果你必須問是否正確,你應該考慮重寫它,看起來是否正確。

0

關閉文件並不是絕對必要的,因爲大多數C運行時會在進程結束時自動關閉文件。但是,在執行此操作時,某些C運行時可能不會刷新緩存中的數據,因此建議您關閉所有打開的文件以避免數據丟失。

+0

PHP自身關閉任何打開的文件,不需要涉及C運行時... – gnud 2009-12-27 17:59:28

0

實際上PHP將關閉它在腳本執行後處理的文件。

這是明確做到這一點的「最佳做法」,但在大多數情況下並不重要。我想,如果有一個不受歡迎的例外,你可能會留下一個'打開'的文件,而且它真的只需要一行就可以關閉 - 爲什麼不呢?

0

問題不在於關閉文件,而是在文件關閉之前刷新輸出。如果一個文件完全關閉,那麼就是這樣 - 它已關閉。如果輸出緩衝區中有任何剩餘數據,則可能會丟失。

現在,PHP關閉文件時可能會「刷新並關閉」,我不知道。但是,這是關於不明確關閉文件的問題的第一件事情。

相關問題