【问题标题】:How can I log fatal errors in PHP?如何在 PHP 中记录致命错误?
【发布时间】:2012-03-08 23:44:14
【问题描述】:

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

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

【问题讨论】:

    标签: php error-handling logging fatal-error


    【解决方案1】:

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

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

    【讨论】:

    • 在 PHP 7 中有一个新的非常有用的 Throwable 类,它最终统一了错误和异常,但要实现它,您必须将错误/异常对象类型转换为 Throwable:try { ggggg(); } catch(\Throwable $e) { var_dump($e); }
    【解决方案2】:

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

    你可以这样做:

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

    【讨论】:

      【解决方案3】:

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

      最好的解决方案是在您的 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ánGrignoli:没有干净的方法来检测该函数是否存在错误。
      • &lt;?php function cleanup(){ print_r(error_get_last()); } register_shutdown_function("cleanup");asdfasdf();
      • 我同意它不是 100% 干净的,但我认为它足以记录错误。
      • Re “使用自定义错误处理程序无法处理致命错误。”:它是否随 PHP 7 改变了?
      【解决方案4】:

      你可以让你的所有 base classes 属于一个使用 method overloading 的超类:

      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”的三振是什么意思?是旧版本吗? - 可以删除吗?还是别的什么?
      • “你所有的基地。”明白了吗?
      【解决方案5】:

      类似:

      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
      
      }
      

      【讨论】:

      • 我有一个错误处理程序来处理我的错误,但是像上面的一些错误,我无法处理它们或记录。
      • 呃,我很确定他想要一个通用的解决方案。
      • 我不知道这个错误发生在哪里。我需要记录所有类型错误
      • 这个答案对我没有帮助,因为我不知道这个错误何时何地发生
      猜你喜欢
      • 2012-08-24
      • 2014-04-17
      • 2014-11-17
      • 1970-01-01
      • 2022-11-16
      • 2011-02-15
      • 2010-09-23
      • 2017-08-22
      • 1970-01-01
      相关资源
      最近更新 更多