PHP/MySQL:我应该使用什么来管理错误?

PHP/MySQL:我应该使用什么来管理错误?,php,mysql,error-handling,Php,Mysql,Error Handling,我有一个使用PHP和Mysqli构建的网站,我现在应该考虑我的错误处理 即使我认为我的代码是完美的,当我向公众发布网站时,也会出现错误。我发现这显示了如何为用户隐藏错误,但开发人员仍然可以看到它们。虽然我不知道这是否真的是我的网站最好的方法。我不希望用户看到我的PHP本身产生的丑陋错误消息,但我可以根据错误设计自己的错误消息 我应该如何管理这些错误?我应该将它们全部保存在数据库中吗 我如何知道会发生哪些错误 PHP具有内置函数来捕获各种类型的错误: set_error_handler 您应该使

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

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

  • 我应该如何管理这些错误?我应该将它们全部保存在数据库中吗
  • 我如何知道会发生哪些错误

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

    set_error_handler
    

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

    我将使用

     try 
        { 
         //your code here 
         } 
     catch(Exception $ex) 
         { 
         echo $ex->getMessage();
         }
    
    执行数据库查询时。错误处理可以将其记录到文件或类似的东西中。 这样,你就能抓住正在发生的事情,并为自己设定需要做的事情

    error_reporting(E_ALL);
    ini_set('display_errors','On');
    
    ini_set('error_log', 'error.log');
    ini_set('log_errors', 'On');
    
    这些函数将显示错误(如果有),并在error.log中列出错误。 如果您想隐藏错误,使其不会出现在站点上,则可以将值从“开”设置为“关”。 如果只想对用户隐藏,而不想对开发人员隐藏,那么可以设置“ini_set('display_errors','off');”,这样用户就看不到这些内容,但开发人员可以通过error.log来解决

    我应该如何管理这些错误

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

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

    否-您将无法看到数据库连接问题。正确的方法是通过本地计算机上的syslog功能

    我如何知道会发生哪些错误


    ??处理错误是应用程序最重要的方面之一。用户希望它能够工作,但当出现错误时,他们可能会对您的应用程序失去信心,不管它是谁的好应用程序。我是通过艰苦的方式学会的

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

    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返回的错误号。如果客户想就错误与我们联系,他所要做的就是告诉我们号码,我们可以立即查找,并将所有数据显示在我们面前

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