【问题标题】:PHP - recording errorsPHP - 记录错误
【发布时间】:2009-11-25 08:53:05
【问题描述】:

记录用户经历的错误的最佳方式是什么?

我最初的想法是创建一个函数,用唯一的编号记录错误,并可能将变量转储到数据库的记录中。

有没有更好的方法?我应该改用文本文件日志吗?

【问题讨论】:

    标签: php logging error-handling


    【解决方案1】:

    如何覆盖默认的 PHP 错误处理程序? 这个网站应该给出一些基本信息:http://www.php.net/manual/en/function.set-error-handler.phphttp://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 连接错误,这可能会引发更多问题。

    【讨论】:

    • +1。关于mysql_query(...) or ...,您可以考虑编写一个自定义的db_query(...),它本身可以处理错误捕获和记录。这样,您也可以记录失败的 SQL。
    【解决方案2】:

    好吧,至少在本地系统上写入文本文件应该不太容易出错,因此您也可以捕获 DB 错误:)

    我更愿意将当前状态的体面转储写入一个简单的日志文件。除了您的“自己的”状态(即您的应用程序的变量和对象)之外,您还可以考虑发送phpinfo() 以获取有关要包含哪些环境和请求变量的灵感。

    【讨论】:

      【解决方案3】:

      PEAR::Log 对于这种日志记录很方便。例如

      $logger->alert("你的消息"); $logger->warning("你的消息"); $logger->notice("你的消息");

      等等

      你可以登录到文件或数据库,我写了一个启用 PDO 的 sqlite 扩展,非常简单。

      这些也很方便放入异常处理代码中。

      PEAR::Log

      记录:id、logtime、身份、严重性 1-7(即“警报”)和您的消息。

      【讨论】:

        【解决方案4】:

        我认为@Icheb 的回答涵盖了所有内容。

        今年我在一个我认为我会分享的项目中尝试了一些新的东西。

        对于基于 PHP 的内容聚合/分发服务,即在某些服务器上安静地在后台运行并且您容易忘记的应用程序,我们需要一个错误报告系统来确保我们注意到错误。

        发生的每个错误都有一个在代码中指定的错误 ID:

        $success = mysql_query(this_and_that);
        if (!$success) log_error ("Failed Query: ".mysql_error(), "MYSQL_123"); 
        

        错误被记录在一个文件中,但更重要的是通过邮件发送给管理员,连同完整的回溯和变量转储。

        为了避免邮件泛滥 - 该服务在美好的一天拥有成千上万的用户 - 每个错误代码仅每 x 小时发送一次错误邮件。如果在该时间段内出现两次相同代码的错误,则不会发送额外的邮件。这意味着每一种错误都会被记录下来,但是当它发生在成百上千的用户身上时,你不会被错误消息杀死。

        这很容易实现;艺术使错误ID正确。例如,您可以为系统中每个失败的 mySQL 查询提供相同的通用“MYSQL”错误 ID。在大多数情况下,这将过于笼统并且阻塞太多。如果你给每个 mySQL 查询一个唯一的错误 ID,你可能会被邮件淹没,过滤效果就消失了。但是当智能分组时,这可能是一个非常好的设置。

        【讨论】:

          【解决方案5】:

          从可用性的角度来看,用户不应该遇到错误。 根据错误,您应该制定不同的策略:

          • 不可捕获的错误或难以从 PHP 中捕获,请阅读每个应用程序的日志
            • 阿帕奇
            • MySQL 和 DB 错误、事务
            • 准备 php 与“正在更新的站点”或错误控制器以应对紧急情况。
          • PHP 错误
            • 这些应该通过异常来检测
            • 沉默但没有忘记,不要试图在运行中修复它们
            • 记录并处理它们
          • 接口错误
            • 建议:允许用户提交建议或错误

          我知道这并没有涵盖所有内容,只是其他人建议的补充。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-02
            • 2012-02-11
            • 1970-01-01
            • 1970-01-01
            • 2018-08-28
            • 2011-09-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多