PHP的error_log函数能在缓冲区内产生一个致命的错误吗?

问题描述:

嗯...这是我的情况:我正在开发一个框架,我目前正在开发错误处理功能。我也想处理错误处理错误!那么...更好地解释:如果我有一个错误,致命或不是,会引发一个异常(在非致命错误的情况下)并且伪造致命错误的异常。异常由“记录器”处理,它可以将错误在控制台(浏览器)上回显或将其存储在文件中。问题是记录器内发生第二次严重错误时。要捕捉它,我使用PHP缓冲区(ob_start())。在这个函数内部不应该出现错误,任何人......换句话说......这是错误跟踪的最后一级。我只能回显错误,但我希望使用PHP错误日志系统注册它们(如果未达到最后一级,则禁用)。这可以使用error_log函数。在用于error_log函数的PHP文档中:PHP的error_log函数能在缓冲区内产生一个致命的错误吗?

“成功返回TRUE或失败时返回FALSE。”

那么......这是我需要的。但是我害怕,因为我不知道这个函数是否会产生致命错误(内部实现)或者只返回TRUE/FALSE。我在localhost SMTP中使用邮件选项(1)进行了测试,并且失败(如预期!​​),生成警告消息。然后缓冲区崩溃在浏览器上显示空白页面(这是我不想要发生的)。这个问题可以通过使用fsockopen检查smtp连接并将返回值归类到类变量来解决。内部缓冲区函数验证了此变量值。如果为TRUE,则调用带email选项的error_log。但在选项0(php文件日志)和3(其他文件)的error_log的情况下?

这正好我的日志类的相关部分:

public function error_buffer($buffer) { 

     $error = error_get_last(); 

     if ($error && ($error ['type'] & E_FATAL && $this->_errhe)) { 

      $this->error_handler_error ($error ['type'], $error ['message'], $error ['file'], $error ['line']); 

      if (ENV === 'production') { 
       return 'error 500'; 
      } 

      return ob_get_contents(); 

     } 

     return $buffer; 

    } 

    public function error_handler_error($errno, $errmsg, $errfile, $errline) { 

      var_dump ($errfile); 

      /* GENERATES WARNING MESSAGE... AND BLANK PAGE! 
      * Here is possible to do: if($this->_email) { error_log() }... 
      */ 
      @error_log ($errmsg, 1, '[email protected]'); 

      // error_log($errmsg, 0); 

    } 

的@不从hapenning停止错误,它只是从显示停止。所以如果mail()失败,那么error_log到email(选项1)也会失败 - 出错。

因此,可能发生的情况是error_log()调用会导致一个错误,该错误会调用您的错误处理函数,该函数调用error_log(),该错误会导致调用错误处理函数的错误,该错误会调用error_log()错误,调用你的错误处理函数,调用error_log(),导致错误,你得到的要点。

如果是这样的话,我能很快想到的解决方案是:

1 - 包括在error_buffer一个静态变量的说:“我目前正在处理错误,不处理任何更多(或只需在屏幕上显示的消息 - 但荣誉INI设置“的display_errors”)

2 - 关掉你的错误处理时,在错误的功能为默认的PHP函数处理它

为什么不打个电话。到“error_log($ errmsg,1,'[email protected]');”在错误函数之外(使用我们没有的@)并且看你的错误处理程序被称为?

+0

谢谢...我想我解决了添加静态变量的问题,你建议! –

+0

不客气,并感谢您的确认。 – Robbie