簡體   English   中英

PHP / MySQL:我應該用什么來管理錯誤?

[英]PHP/MySQL: What should I use to manage errors?

我有一個使用PHP和Mysqli構建的網站,我正處於我應該考慮我的錯誤處理的部分。

即使我認為我的代碼是完美的錯誤,當我向公眾發布網站時也會出現錯誤。 我發現這個答案顯示了我如何為用戶隱藏錯誤,但開發人員仍然可以看到它們。 雖然我不知道這是否真的是我網站的最佳方法。 我不希望用戶看到我的PHP本身產生的丑陋的錯誤消息,但我可以根據錯誤設計我自己的錯誤消息。

  1. 我該如何處理這些錯誤? 我應該將它們全部保存在數據庫中嗎?
  2. 我如何知道可能發生的錯誤?

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返回的錯誤編號。 如果客戶想要就錯誤與我們聯系,他所要做的就是告訴我們這個號碼,我們可以立即查找並將所有數據放在我們面前。

我附上了開發錯誤屏幕的截圖。

錯誤屏幕的示例圖像

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM