【问题标题】:PHP error_get_last getting warning despite error_handling = 1尽管 error_handling = 1 PHP error_get_last 得到警告
【发布时间】:2014-10-27 07:00:38
【问题描述】:

所以我在 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!为什么它向我显示警告?它没有记录它,但它导致我无法捕捉到导致白屏的错误,这正是这段代码应该避免的!

【问题讨论】:

    标签: php error-handling error-reporting


    【解决方案1】:

    关闭处理程序和 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;
            } 
        }
    }
    

    【讨论】:

    • 似乎 E_ERROR 从未进入此方法。我从this question 获得了原始代码。嗯……
    • 啊哈!但是,如果我结合您的答案,我想我正在做某事。
    • @andrew 你说得对,我忘了。当您到达关闭处理程序时,您的输出已经发送。因此,如果您是白屏,那么警告或错误可能会阻止发送输出?
    • 没错,我有一个(据我所知)可行的解决方案。我要添加它。
    【解决方案2】:

    所以基本上我已经采纳了 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 ''; 
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多