PHP处理致命错误,并将其存储在一个文件

问题描述:

我用下面的代码来捕获未捕获的异常和错误,PHP处理致命错误,并将其存储在一个文件

function my_exception_handler($e) { 
     $dataToStore = array("error" => $e, "server" => $_SERVER, "request" => $_REQUEST, "backtrace" => debug_backtrace()); 

       //Store $dataToStore in a file 
} 

function my_error_handler($no, $str, $file, $line) { 
    $e = new ErrorException($str, $no, 0, $file, $line); 
    my_exception_handler($e); 
} 

set_error_handler('my_error_handler'); 
set_exception_handler('my_exception_handler'); 

我想知道是否有办法让这家店只有致命错误在文件 $ e数组中有一个显然总是0的严重性。

+4

您总是可以解析'error_log'和grep for fatals。 – 2012-04-25 20:35:52

需要register_shutdown_function完成这个任务:

register_shutdown_function(function() { 
    $err = error_get_last(); 

    if(!is_null($err)) { 
    if ($err['type'] == E_ERROR || $err['type'] == E_CORE_ERROR) { // extend if you want 
     // write to file.. 
    } 
    } 
}); 

// test it with 
ini_set('max_execution_time', 1); 
sleep(5); 

$err['type']可以由这个页面上定义的常量:Error Handling > Predefined Constants

欲了解更多信息,请参见:Catching fatal errors in PHP

+1

您的代码段如何区分致命和警告? – 2012-04-25 20:44:11

+0

现在它确实,谢谢你的提示。 :) – 2012-04-25 20:47:32

function my_error_handler($no, $str, $file, $line) { 
    switch($no){ 
     case E_CORE_ERROR:  
      $e = new ErrorException($str, $no, 0, $file, $line); 
      my_exception_handler($e); 
      break; 
    } 
} 

根据PHP的文档在set_error_handler上,指定的处理程序应该具有以下形式:

处理机(INT $错误号,串$ errstr [,串$ ERRFILE [摘要$ errline [,阵列$ errcontext]]])

(...)

第一个参数,errno,包含提出的错误的级别,作为一个整数。

这意味着你应该让你的错误处理程序是这样的:

<?php 

function my_error_handler($errno, $errstr, $errfile, $errline, $errcontext) { 
    // Only process fatal errors 
    if ($errno == E_ERROR) { 
     // Do your error processing 
    } 
} 

set_error_handler('my_error_handler'); 

?> 

使用这种方法,你可以精确地控制你如何处理各类型的错误。


如果你只是要处理的致命错误,你可以做的是要容易得多:

混合的set_error_han dler(可调用$ error_handler [摘要$ error_types = E_ALL | E_STRICT])

第二个参数$error_types允许您指定应该使用自定义错误处理程序处理哪些错误。您可以通过E_ERROR常量,如下所示:

<?php 

// Use your existing function 

set_error_handler('my_error_handler', E_ERROR); 

?> 
+0

你的逻辑有道理,但set_error_handler似乎忽略致命错误,它捕获一切,但致命错误,我的意思是当发生致命错误时,my_error_handler不会被调用,我使用5.2.13 – Yasser1984 2012-04-26 17:42:47