2012-01-24 76 views
3

希望這裏有人可以幫助我 - 基本上我有一個日誌類,我正在更新(使它成爲老年前),並且我想確保它在98-99%的情況下記錄消息。但是現在它不處理exit(),它每次向記錄器發送消息/錯誤時基本上只寫入一個文件(打開,寫入和關閉)。在PHP中編寫(To File)記錄器的最有效方法?

什麼是最好的方式來處理exit()s,並且在磁盤寫入方面是高效的?現在我正在查看logger類中的__destruct(使用fopen,fwrite和fclose進行調用),但是我不太確定這是安全的還是有效的。

編輯:怎麼樣set_error_handler()?我記得幾年前,這是非常緩慢的,並不是很好的自定義錯誤/消息(像SQL問題)

+0

所以,問題是,如果你使用'退出()'或'死()'在你的腳本如何調用你的記錄? –

+0

考慮'file_put_contents()'而不是'fopen()','fwrite()','fclose()'也可能是一個想法。 – CD001

+0

肖恩的答案是你要找的。實現'register_shutdown_function'應該可以幫助你,而不需要改變很多代碼。 –

回答

6

如果您希望您的腳本結束記錄的東西,你應該看看PHP的register_shutdown_function()

function shutdown() 
{ 
    // .. log code here. 
} 

register_shutdown_function('shutdown'); 

你應該避免使用__destruct()方法也不能保證,這將是當你期望它被調用時調用。

你也可以看看內置在error_log()方法中的PHP,將內容寫入實際的PHP錯誤日誌文件(這可能比編寫自己的記錄器更可靠)。

參考文獻:

http://php.net/manual/en/function.register-shutdown-function.php

http://php.net/manual/en/function.error-log.php

+0

除此之外,爲了提高效率,在構造函數中打開一次文件,根據需要執行寫入操作,然後在關閉函數中關閉文件。 – Leigh

+0

謝謝。我想我會在類中使用register_shutdown_function,在__construct中調用它。這樣它只需要加載被調用,並且比__destruct更安全。 – Jon

1

我總是使用一些全局函數,例如

function BeforeExit() { 
    //do stuff like logging 
    exit; 
} 
+0

我在header(),die()等之前使用相同的「構造」來保存會話數據,設置(新)cookie數據,做日誌記錄,做基準測試等等。 – djot

1

我開發了一個星期前一個記錄器類。我已經解決了的問題是:

Post all kinds of errors (E_PARSE,E_ERROR,E_NOTICE,E_WARRNING etc..) into log file using some format methods.

即:

[xxxx-xx-xx xx:xx]

User id: 123

Widget id:321

Error:"The message from PHP"

Line:345

File:test.php

我曾在這裏發現的是PHP是2的錯誤類型:

  1. 嚴格(E_ERROR,E_PARSE等)

  2. 不嚴格(E_WARRNING,E_NOTICE)

嚴格而不嚴格我自己調用它,它不是來自PHP文檔。類型2可能有幾個錯誤,但類型1只有一個錯誤,致命。 (正如我發現)

我用錯誤處理程序上述兩種類型的:

錯誤處理程序#1

//set 'shutdown_handler' function as strict error handler 
register_shutdown_function(array($this, 'shutdown_handler')); 

//what does the function look like 
public function shutdown_handler() 
{ 
    // get last occured error 
    $e = error_get_last();  
    $this->LogErrors($e['message'], $e['type'], $e['file'], $e['line']);   
} 

錯誤處理程序#2

//set 'error_handler' function as not strict error's handler 
set_error_handler(array($this, 'error_handler')); 

//what does the function look like 
public function error_handler($errno, $errstr, $errfile, $errline) 
{ 
    $this->LogErrors($errstr, $errno, $errfile, $errline); 
} 

所以,如果我有例如類型2在我的腳本中有25個錯誤,而類型1中有一個錯誤,我會在我的日誌文件中看到所有這些錯誤。

希望我是有幫助的,並明確

相關問題