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的严重性。
需要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
您的代码段如何区分致命和警告? – 2012-04-25 20:44:11
现在它确实,谢谢你的提示。 :) – 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);
?>
你的逻辑有道理,但set_error_handler似乎忽略致命错误,它捕获一切,但致命错误,我的意思是当发生致命错误时,my_error_handler不会被调用,我使用5.2.13 – Yasser1984 2012-04-26 17:42:47
您总是可以解析'error_log'和grep for fatals。 – 2012-04-25 20:35:52