嗯......这是我的情况:我正在开发一个框架,我正在开发错误处理功能。我也想要处理错误处理错误!嗯...解释得更好:如果我有错误,致命或不致,会抛出异常(如果是非致命错误)和伪造的致命错误异常。异常由“记录器”处理,它可以在控制台(浏览器)上处理错误回显或将其存储在文件中。问题是在记录器内发生第二次FATAL错误。为了捕获它我正在使用PHP缓冲区(ob_start())。在这个函数里面永远不会出现错误,任何人....换句话说......这是错误跟踪的最后一个级别。我可以回应错误,但我想使用PHP错误日志系统注册它们(如果没有达到最后一级则禁用)。这可以使用error_log函数。在用于error_log函数的PHP文档中:
“成功时返回TRUE,失败时返回FALSE。”
嗯......这就是我需要的。但我担心,因为我不知道这个函数是否会产生致命错误(内部实现)或只返回TRUE / FALSE。我在localhost SMTP中使用邮件选项(1)进行了测试,这失败了(正如预期的那样!),生成警告消息。然后缓冲区崩溃在浏览器上显示空白页面(这是我不希望发生的事情)。可以解决这个问题,检查与fsockopen的smtp连接,并将返回值归因于类变量。在内部缓冲区功能中,验证此变量值。如果为TRUE,则调用带有电子邮件选项的error_log。但是在error_log的情况下,选项0(php文件日志)和3(其他文件)?
这是我的日志记录类的相关部分:
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, 'lucas@lucas.com' );
// error_log($errmsg, 0);
}
答案 0 :(得分:2)
@不会因为hapenning而停止错误,只会阻止它显示。因此,如果mail()失败,那么error_log到电子邮件(选项1)也将失败 - 出错。
因此,可能发生的事情是error_log()调用导致调用错误处理函数的错误,调用error_log()导致调用错误处理函数的错误,调用error_log()导致错误调用你的错误处理函数,调用error_log()导致错误....你得到了要点。
如果是这种情况,我可以快速想到的解决方案是:
1 - 在error_buffer中包含一个静态变量,说“我正在处理一个错误,不再处理(或只是在屏幕上显示消息 - 但尊重ini设置”display_errors“)。
2 - 在错误函数中关闭错误处理,默认PHP函数处理它。
为什么不拨打“error_log($ errmsg,1,'lucas@lucas.com');”在错误函数之外(我们没有@)并查看是否正在调用错误处理程序?