PHP:如何记录致命错误?

时间:2012-02-17 15:06:00

标签: php error-handling logging fatal-error

如何将此错误记录到文本文件或数据库?

Fatal error: Call to undefined method PROJECTS::ssss()

5 个答案:

答案 0 :(得分:9)

使用自定义错误处理程序处理致命错误不可能

最好的解决方案是在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行。

答案 1 :(得分:9)

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

你可以这样做:

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);
}

答案 2 :(得分:4)

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

try {

    ggggg(); // <---- make a fatal error

} catch(\Throwable $e) {

    var_dump($e);

}


旧帖子catch(Error $e)已更改为catch(\Throwable $e),但两者都有效

答案 3 :(得分:1)

您可以使用method overloading将所有 base 属于超类:

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开始)。

答案 4 :(得分: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

}