PHP - 记录错误
记录用户遇到的错误的最佳方式是什么?PHP - 记录错误
我最初的想法是创建一个函数,该函数用一个唯一的数字记录错误,并且可能将变量转储到数据库中的记录中。
有没有更好的方法?我应该使用文本文件日志吗?
嗯,至少写文本在本地系统上的文件应该是不易出错,从而使你能够捕捉DB错误太:)
我宁愿当前状态的一个体面的自卸写入简单的日志文件。除了你的“自己”状态(即你的应用程序的变量和对象)之外,你可能会考虑做一个phpinfo()
以获得有关包含哪些环境和请求变量的灵感。
如何覆盖默认的PHP错误处理程序? 这个网站应该提供一些基本信息:http://www.php.net/manual/en/function.set-error-handler.php和http://www.php.net/manual/en/function.set-exception-handler.php
您也可能希望存储数据库错误,也许是某种自定义的功能,使您可以使用类似的代码的第一个注释:
<?php
$objQueryResult = mysql_query("query here") or some_kind_of_function_here();
?>
您可能希望将记录的错误存储在公共html根文件夹之外的文件中,以确保人们无法意外访问它。 我也假设你想在这样的文件中存储一个完整的堆栈跟踪,因为那样你实际上可以调试这个问题。 当覆盖默认错误处理程序时,请注意您不要忘记向用户发送一条好消息(并在需要时退出脚本)。
我会建议存储:
- $ _ POST
- $ _GET
- 完整的转储 debug_print_backtrace的()
- 将可能触发这个SQL?
我建议您使用debug_print_backtrace()来确保您获得数据摘要。 debug_backtrace()函数提供了相同的信息,但它有时会给你太多的信息。 你可以用它来赶上回溯代码:
<?php
ob_start();
debug_print_backtrace();
$trace = ob_get_contents();
ob_end_clean();
?>
要保存这一点,你可以使用一个纯文本输出,如果你没有得到太多的错误,否则可能使用类似的SQLite? - 只要不使用相同的SQL连接来存储错误,如果你的网络服务器发生SQL连接错误,可能会引发更多问题。
PEAR :: Log对于这种记录很方便。例如
$logger->alert("your message"); $logger->warning("your message"); $logger->notice("your message");
等
您可以登录到一个文件或数据库,我写了一个PDO启用sqlite的延伸,非常简单。
这些都很方便地放入异常处理代码中。
记录:ID,logTime Description该条,身份,严重性1-7(即 “警报”),和您的邮件。
我认为@ Icheb的答案涵盖了所有。
我今年在一个我认为我会分享的项目中尝试了一些新的东西。
对于基于PHP的内容聚合/分发服务,在一些服务器上后台安静地运行并且您容易忘记的应用程序,我们需要一个错误报告系统来确保我们发现错误。
每出现一个错误具有在代码中指定的错误ID:
$success = mysql_query(this_and_that);
if (!$success) log_error ("Failed Query: ".mysql_error(), "MYSQL_123");
错误得到一个完整的回溯记录在一个文件,但更重要的是通过邮件发送给管理员,一起变量转储。
为避免邮件泛滥 - 该服务在一天中有成千上万的用户 - 错误邮件每发送一个错误代码,每发送一个错误邮件只发送一次。在该时间范围内发生两次相同代码的错误时,不会发送额外的邮件。这意味着每种错误都会被记录下来,但是当数百或数千用户发生错误时,您不会被错误消息所杀。
这很容易实现;艺术正在获得错误ID。例如,您可以在系统中为每个失败的mySQL查询提供相同的通用“MYSQL”错误ID。在大多数情况下,这将是太通用,并阻止太多。如果你给每个mySQL查询一个唯一的错误ID,你可能会流入邮件并且过滤效果消失。但是当智能分组时,这可能是一个非常好的设置。
从可用性的角度来看,用户不应该经历过错误。 根据错误,你应该做出不同的策略:
- 不开捕错误或难以从PHP来抓,阅读日志为每个应用程序
- 阿帕奇
- MySQL和数据库错误,交易
- 准备PHP与“网站正在更新”或错误控制器的紧急情况。
- PHP错误
- 这些都应该通过例外被检测
- 沉默,但没有被遗忘,不要试图去解决这些问题的飞行
- 记录它们,并把它们
- 接口错误
- 建议:允许用户下载它建议或错误
我知道这个简化版,全覆盖,只是增编其他建议。
+1。关于'mysql_query(...)或...',你可能会考虑编写一个自定义的'db_query(...)',它本身可以处理错误捕获和日志记录。这样,您也可以记录失败的SQL。 – jensgram 2009-11-25 09:21:57