0

我有一个使用 PHP 和 Mysqli 构建的网站,我应该考虑我的错误处理。

即使我认为我的代码是完美的,当我向公众发布网站时也会出现错误。我发现这个答案显示了我如何为用户隐藏错误,但开发人员仍然可以看到它们。虽然我不知道这是否真的是我网站的最佳方法。我不希望用户看到丑陋的错误消息产生了我的 PHP 本身,但我可以根据错误设计自己的错误消息。

  1. 我应该如何管理这些错误?我应该将它们全部保存在数据库中吗?
  2. 我怎么知道可能发生哪些错误?
4

5 回答 5

2

PHP 有内置函数来捕捉各种类型的错误:

set_error_handler

您应该使用此功能来捕获所有页面的错误,您可以编写自定义代码是否将错误插入数据库,或者写入单独的错误日志文件,或者通过电子邮件立即通知开发人员,您可以决定。

于 2013-01-28T12:10:58.760 回答
0
error_reporting(E_ALL);
ini_set('display_errors','On');

ini_set('error_log', 'error.log');
ini_set('log_errors', 'On');

如果有任何错误,这些函数将显示错误,它还将在 error.log 中列出错误。如果您想隐藏错误出现在站点上,那么您可以将值从“on”设置为“off”。如果您只想对用户隐藏它而不是对开发人员隐藏它,那么您可以设置“ini_set('display_errors','off');” 所以这些对用户来说是不可见的,但开发人员可以从 error.log 中解决它

于 2013-01-28T12:26:34.113 回答
0

我应该如何管理这些错误?

您应该记录它们并分析日志以解决它们(或至少确保您的站点是安全的)。

我应该将它们全部保存在数据库中吗?

不 - 您将失去对数据库连接问题的了解。正确的方法是通过本地机器上的 syslog 功能。

我怎么知道可能发生哪些错误?

? 他们全部。

于 2013-01-28T13:06:28.157 回答
0

我会先使用

 try 
    { 
     //your code here 
     } 
 catch(Exception $ex) 
     { 
     echo $ex->getMessage();
     }

在进行数据库查询时。错误处理可以将其登录到文件或类似的东西。这样你就可以捕捉到正在发生的事情并为自己设定需要做的事情......

于 2013-01-28T12:12:04.480 回答
0

处理错误是应用程序最重要的方面之一。用户希望它能够工作,但是当发生错误时,他们可能会对您的应用程序失去信心,无论它是谁。我很难学会。

我们使用类似于以下的类:

class ErrorHandler
{   
    public static function registerHandlers()
    {
        $inst = new ErrorHandler;
        set_error_handler(array(&$inst, 'errorHandler'), E_ALL);
        set_exception_handler(array(&$inst, 'exceptionHandler'));
        register_shutdown_function(array(&$inst, 'shutdownHandler'));
    }

    public function shutdownHandler()
    {
        if (($error = error_get_last()))
        {
            $this->_clearOutputBuffers();
            // Handle error
        }
    }

    public function errorHandler($errno, $errstr, $errfile, $errline, $errcontext)
    {
        $this->_clearOutputBuffers();
        // Handle error
    }

    public function exceptionHandler(Exception $exception)
    {   
        $this->_clearOutputBuffers();
        // Handle error
    }

    private function _getErrorCode($sMessage, $sFile, $nLine, $nCode)
    {
        $errorCode = sprintf("%u", crc32($sMessage.$sFile.$nLine.$nCode));
    }

    private function _clearOutputBuffers()
    {
        if (count(ob_list_handlers()) > 0)
        {
            ob_clean();
        }
    }
}

这个类能够捕捉到大多数错误,并且在调试方面也能很好地工作。当发现错误时,我们会将所有信息写入一个文件,以便以后参考。此外,我们将开发和生产环境分开,并为其设置单独的错误屏幕。

对于开发环境,我们使用错误屏幕显示文件的提取、堆栈跟踪和变量。

对于生产环境,我们会显示一个错误屏幕,其中包含从 _getErrorCode 返回的错误号。如果客户想就错误与我们联系,他所要做的就是告诉我们号码,我们可以立即查找并将所有数据摆在我们面前。

我附上了我们的开发错误屏幕的屏幕截图。

错误屏幕的示例图像

于 2013-01-28T13:56:29.110 回答