所以在php.ini中,我设置了:
error_reporting = E_ERROR我写了一个处理程序:
register_shutdown_function( "fatal_handler" );
function fatal_handler() {
$errfile = "unknown file";
$errstr = "shutdown";
$errno = E_CORE_ERROR;
$errline = 0;
$error = error_get_last();
if( $error !== NULL) {
$errno = $error["type"];
$errfile = $error["file"];
$errline = $error["line"];
$errstr = $error["message"];
if($errno == E_ERROR){
$html = 'some html here';
print($html);
die();
}
}
}我为测试它所做的是在一个脚本中放置一个比max_execution_time更长的睡眠时间。由于某些原因,如果我在另一个选项卡中打开一个新的页面,同时加载故意损坏的页面,这也会杀死其他页面。没关系,但是当第二个页面崩溃时,它给了我一个error_get_last()的警告。但我将error_reporting设置为1!为什么要给我看警告?它不会记录它,但是它会导致我无法捕捉导致白屏幕的错误,这正是这段代码应该避免的事情!
发布于 2014-09-03 17:32:16
基本上,我采用了Evan的答案,并将其与this question's answer相结合,我得到了一个看似可行的解决方案。如果将myHandler设置为记录错误/警告,则error_reporting将捕获错误/警告并记录它们。然后返回true,这将防止警告进入error_get_last()。因此,现在error_get_last()调用应该只返回绕过错误处理程序的内容,例如E_ERROR。
register_shutdown_function('fatal_handler');
set_error_handler('myHandler');
function myHandler($errno, $errstr, $errfile, $errline, $errctx){
if((error_reporting() & $errno) && ini_get('log_errors') == 'On'){
error_log(getFriendlyErrorType($errno) . ': ' . $errstr . ' in ' . $errfile . ' on line ' . $errline);
}
return true;
}
function fatal_handler() {
$error = error_get_last();
if($error !== NULL) {
$errno = $error["type"];
$errfile = $error["file"];
$errline = $error["line"];
$errstr = $error["message"];
if($errno == E_ERROR){
$html = '[some html]';
print($html);
die();
}
}
}
function getFriendlyErrorType($type)
{
switch($type)
{
case E_ERROR: // 1 //
return 'PHP Error';
case E_WARNING: // 2 //
return 'PHP Warning';
case E_PARSE: // 4 //
return 'PHP Parse';
case E_NOTICE: // 8 //
return 'PHP Notice';
case E_CORE_ERROR: // 16 //
return 'PHP Core Error';
case E_CORE_WARNING: // 32 //
return 'PHP Core Warning';
case E_CORE_ERROR: // 64 //
return 'PHP Compile Error';
case E_CORE_WARNING: // 128 //
return 'PHP Compile Warning';
case E_USER_ERROR: // 256 //
return 'PHP User Error';
case E_USER_WARNING: // 512 //
return 'PHP User Warning';
case E_USER_NOTICE: // 1024 //
return 'PHP User Notice';
case E_STRICT: // 2048 //
return 'PHP Strict Standards';
case E_RECOVERABLE_ERROR: // 4096 //
return 'PHP Recoverable Error';
case E_DEPRECATED: // 8192 //
return 'PHP Deprecated';
case E_USER_DEPRECATED: // 16384 //
return 'PHP User Deprecated';
}
return '';
} 发布于 2014-09-02 22:21:22
无论是关闭处理程序还是error_get_last都不尊重error_reporting。
将始终调用关机处理程序,而不考虑任何错误或其级别(除非您在自定义错误处理程序中抛出异常)
error_get_last只给出了最后一个错误,不管它的级别如何。
与其使用关闭处理程序,为什么不使用错误处理程序呢?在这种情况下,如果要忽略该级别的错误,可以检查错误级别并返回FALSE。(返回FALSE告诉PHP继续正常进行)
set_error_handler("fatal_handler");
function fatal_handler($errno, $errstr, $errfile, $errline, $errctx)
{
$reptLevel = error_reporting();
if ($reptLevel > 0) //if $reptLevel = 0 then it means the code that caused the error was preceded by a supressor (example: $x = @someFunction())
{
if ($errno == E_ERROR)
{
$html = 'some html here';
print($html);
die();
} else {
return false;
}
}
}https://stackoverflow.com/questions/25633104
复制相似问题