如何在PHP中记录未捕获的异常?

时间:2020-03-05 18:41:36  来源:igfitidea点击:

我已经找到了如何将错误转换为异常的方法,并且如果没有发现它们,我会很好地显示它们,但是我不知道如何以有用的方式记录它们。简单地将它们写入文件将不会有用,对吗?当我们不知道是什么引起异常时,我们是否会冒险访问数据库?

解决方案

回答

我们可以使用set_error_handler设置自定义异常来记录错误。我个人考虑将它们存储在数据库中,因为默认的异常处理程序的回溯可以提供有关导致它的原因的信息,但是,如果数据库处理程序触发了异常,这当然是不可能的。

我们也可以使用error_log记录错误。它可以选择消息目的地,包括:

Quoted from error_log
  
  
  PHP's system logger, using the Operating System's system logging mechanism or a file, depending on what the error_log  configuration directive is set to. This is the default option.
  Sent by email to the address in the destination  parameter. This is the only message type where the fourth parameter, extra_headers is used.
  Appended to the file destination . A newline is not automatically added to the end of the message  string.

编辑:markdown是否具有下划线的noparse标签?

回答

我真的很喜欢log4php进行日志记录,即使它尚未离开孵化器也是如此。我几乎在所有情况下都使用log4net,并且发现该样式对我来说很自然。

关于系统崩溃,我们可以将错误记录到多个目标位置(例如,具有阈值为CRITICAL或者ERROR的添加程序仅在出现问题时才起作用)。我不确定现有添加程序的故障安全性如何(如果数据库关闭,该添加程序如何失败?),但是我们可以很容易地编写自己的添加程序,如果无法记录该添加程序会自动失败。

回答

Simply writing them to a file won't be useful, will it?

但这当然是一件很棒的事情,比在屏幕上显示它们要好得多。我们想向用户显示一个漂亮的屏幕,上面写着"对不起,我们很烦。通知了工程师。请再试一次",并且绝对没有技术细节,因为这样做会带来安全风险。我们可以将电子邮件发送到共享邮箱,并将异常记录到文件或者数据库中,以备后用。这将是最佳实践。

回答

我认为这很大程度上取决于错误发生的位置。如果数据库关闭,则将其记录到数据库中不是一个好主意;)

我使用syslog()函数记录错误,但是当我在没有syslog支持的系统上时,将其写入文件没有问题。我们可以轻松地将系统设置为使用logwatch或者标准syslogd向我们发送电子邮件或者jabber消息。

回答

我会将它们写到文件中,然后可能会设置一个监视系统来检查文件大小或者上次修改日期的更改。 Webmin是一种简单的方法,但是有更多完整的软件解决方案。

如果我们知道其一次性错误,则可以通过电子邮件发送通知。但是,由于每分钟点击率很高的网站,永远不要通过电子邮件发送通知。我已经看到一个网站因每分钟生成数百封电子邮件而崩溃,原因是该系统无法连接到数据库。由于每个新消息都运行邮件服务器,因此它的LoadAvg也大于200,这根本没有帮助。在那种情况下,最好的情况是,看门狗在远处检查文件大小并连接到外部服务以发送SMS(可能是IM),或者让外部系统在网页上查找错误消息(这并没有发生)。不必在屏幕上可见,也可以在HTML注释中显示)。

回答

我第二个log4php。我通常将其配置为将诸如异常之类的内容发送到ERROR或者CRITITCAL,并将其写入syslog。从那里,我们可以将syslog提要到Zenoss,Nagios,Splunk或者syslog可以交谈的任何其他内容中。

回答

我们还可以使用Google表单捕获和记录PHP异常。这里有一个教程来解释该过程。