2012-06-08 126 views
1

我在腳本的前幾行有這個簡單的代碼,它在記錄錯誤方面非常好用,直到我添加錯誤處理函數。我的錯誤處理函數做得非常好,我還沒有發現任何錯誤的預期。錯誤處理程序函數停止錯誤日誌記錄

ini_set("log_errors" , "1"); 
ini_set("error_log" , $_SERVER['DOCUMENT_ROOT']."/logs/Errors.log.txt"); 

這是PHP的默認工作,錯誤記錄只要您開始錯誤處理就會停止?

如果是,我該如何克服它?

我的錯誤處理函數可能會有所幫助。

function userErrorHandler($errno, $errstr, $errfile = '', $errline = 0, $errcontext = array()) 
{ 
    // Check if the error code is not included in error_reporting 
    if (!(error_reporting() & $errno)) 
    { 
     return; 
    } 

    // Restore default handlers to prevent errors in errors 
    restore_error_handler(); 
    if (function_exists('restore_exception_handler')) 
    { 
     restore_exception_handler(); 
    } 

    // Load error page 
    require('_errors/error.php'); 
    exit(); 
} 
set_error_handler('userErrorHandler'); 

回答

0

好的。因此,它會覆蓋默認處理程序,並且錯誤記錄停止,他們也無法克服該問題。但是在這裏還可以做其他事情,並得到與預期相同的產出。

function userErrorHandler($errno, $errstr, $errfile = '', $errline = 0, $errcontext = array()) 
{ 
    // Getting error type 
    $errorType = array (
      E_ERROR   => 'ERROR', 
      E_WARNING  => 'WARNING', 
      E_PARSE   => 'PARSING ERROR', 
      E_NOTICE   => 'NOTICE', 
      E_CORE_ERROR  => 'CORE ERROR', 
      E_CORE_WARNING => 'CORE WARNING', 
      E_COMPILE_ERROR => 'COMPILE ERROR', 
      E_COMPILE_WARNING => 'COMPILE WARNING', 
      E_USER_ERROR  => 'USER ERROR', 
      E_USER_WARNING => 'USER WARNING', 
      E_USER_NOTICE => 'USER NOTICE', 
      E_STRICT   => 'STRICT NOTICE', 
      E_RECOVERABLE_ERROR => 'RECOVERABLE ERROR' 
      ); 

    if (array_key_exists($errno, $errorType)) { 
     $err = $errorType[$errno]; 
    } else { 
     $err = 'CAUGHT EXCEPTION'; 
    } 

    // Logging error to a certain file 
    $file   = ini_get('error_log'); 
    $error_string = "[" . date("d-M-Y H:i:s", $_SERVER['REQUEST_TIME']) . '] PHP ' . $err . '::' . $errstr . " in " . $_SERVER['SCRIPT_FILENAME'] . " on line " . $errline . "\r\n"; 
    error_log($error_string, 3, $file); 

    // Check if the error code is not included in error_reporting 
    if (!(error_reporting() & $errno)) 
    { 
     return; 
    } 

    // Restore default handlers to prevent errors in errors 
    restore_error_handler(); 
    if (function_exists('restore_exception_handler')) 
    { 
     restore_exception_handler(); 
    } 

    // Load error page 
    require('_errors/error.php'); 
    exit(); 
} 
set_error_handler('userErrorHandler'); 

,我想做的事:)

讀取相同的完整的工作在這裏:http://blog.abhishekg.com/2012/06/error-handling-in-php-with-error-logger-working/

0

當你開始使用set_error_handler(),內置的錯誤處理不會發生,有分析錯誤的可能除外(但只有當error_log定義你的PHP腳本本身之外的,如.htaccess) 。

這同樣適用於PHP所做的默認錯誤迴應。

更新

set_error_handler()回報NULL當先前的錯誤處理程序內置於一體,所以它不可能用自己的功能已收到的參數來調用它的返回值。

+0

所有我使用的是restore_error_handler()和restore_exception_handler()做的工作。我應該發佈我的錯誤處理函數以便更好地理解? – abhig10

+0

@abhig嗯,你爲什麼使用'restore_error_handler()',如果你沒有定義自己的? :) –

+0

嗯..其實它不是我自己的腳本。我從某人那借來的。我仍然試圖完全明白 – abhig10