如何在PHP中记录致命错误?

10

我该如何将以下错误记录到文本文件或数据库中?

致命错误:调用未定义的方法 PROJECTS::ssss()

5个回答

13

有一种方法可以处理您的任务,实际上您可以在致命错误上设置自定义错误处理程序。

您可以按照以下方式执行:

有一种应对任务并能够在发生致命错误时设置自定义错误处理程序的方法。

您可以这样做:

ini_set('error_reporting', E_ERROR);
register_shutdown_function("fatal_handler");
function fatal_handler() {
    $error = error_get_last();
    // Do whatever you want with this error. For example:
    YourDBApplicationLayer::writeFatal($error);
}

11

使用自定义错误处理程序无法处理致命错误。

最好的解决方案是在php.ini中启用错误日志记录(例如,到syslog),然后使用类似logcheck / logsentry的工具定期接收有关异常syslog条目的电子邮件。
除了syslog之外,PHP还可以将错误记录到文件中-只需查看php.ini的错误记录选项即可。

log_errors = On
error_log = syslog
error_log = /path/to/some/folder/phperrors.log

显然,你只想使用其中一个error_log行。


你应该能够使用register_shutdown_function()处理致命错误。 - Sebastián Grignoli
@SebastiánGrignoli:没有一种简单的方法来检测该函数中是否存在错误。 - ThiefMaster
5
<?php function cleanup(){ print_r(error_get_last()); } register_shutdown_function("cleanup");asdfasdf(); - Sebastián Grignoli
我同意这不是100%干净的,但对于记录错误来说已经足够了,我认为。 - Sebastián Grignoli
“使用自定义的错误处理程序无法处理致命错误。”:在 PHP 7 中是否有所改变? - Peter Mortensen

7

在 PHP 7 中,现在可以捕获致命错误:

try {
    
    ggggg(); // <---- make a fatal error
    
} catch(Throwable $e) {
    
    var_dump($e);
    
}

1
在 PHP 7 中,有一个新的非常有用的 Throwable 类,它最终统一了错误和异常,但要实现它,您必须将错误/异常对象强制转换为 Throwable:try { ggggg(); } catch(\Throwable $e) { var_dump($e); } - yodabar

1

你可以将所有的基础都归属于一个使用方法重载的超级类:

class Base 
{
    public function __call($name)
    {
        MyLog::logError(...);
        trigger_error("Function ".get_class($this)."::$name doesn't exist", 
            E_USER_ERROR);
    }
}

试图调用从Base派生的类的不存在方法最终将由Base::__call()处理。对于静态方法,相应地,有__callStatic()(自PHP 5.3起)。


“base” 的删除线是什么意思?它是旧版本吗?可以删除吗?还是其他什么原因? - Peter Mortensen
“所有的基地。”明白了吗? - Linus Kleen

0

类似这样:

if(!method_exists($obj, 'method')){

   $db->log('What you want to log'); //log in your DB
   error_log('message');//Write to php's error log

}

我有一个错误处理程序来处理我的错误,但是有些错误,比如上面的那个,我无法处理或记录。 - Hamidreza
1
哎呀,我很确定他想要一个通用的解决方案。 - ThiefMaster
1
我不知道这个错误发生在哪里。我需要记录所有类型的错误。 - Hamidreza
这个答案对我没有帮助,因为我不知道这个错误发生在哪里或何时发生。 - Hamidreza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接