2015-03-08 2 views
1

У меня есть пользовательские обработчики ошибок на моем компьютере производства:Формат PHP ошибка на сервере производства

register_shutdown_function("check_for_fatal"); 
set_error_handler('errHandle'); 
set_exception_handler("log_exception"); 

Все ошибки направляются почтой. Но формат ужасен (текст прямой линии).

Кто-нибудь знает любую библиотеку, функцию, владеет любым кодом, который форматирует ошибку в html с максимально возможной детализацией. (сообщение, файл, строка, errorclass, полный столбец, возможно, глобальные переменные - $ _GET, $ _POST, ...) Как можно больше информации, поэтому у меня будут проблемы с устранением проблем.

+0

Почему html? Это довольно опасная разметка/язык для такой цели отладки. – arkascha

+1

Возможно, вы используете Sentry для PHP: https://www.getsentry.com/for/php/ –

+0

Awesome! Обработка всех проблем вне синтаксиса. +1 для вас, сэр! –

ответ

0

Я также создаю свои собственные. Поскольку я много разбираюсь с PDO, я также проверяю, является ли исключение PDO и добавляет некоторые детали.

Выход не очень красив, но предназначен для разработчиков, и никто другой.

static function FormatException($exception, $level = 0) 
     { 
      $result = ""; 
      $result = sprintf('<div style="padding-left:%dpx">', $level * 20); 
      $result .= sprintf("<div><b>Message: </b> %s</div>", $exception->getMessage()); 
      $result .= sprintf("<div><b>Code: </b> %s</div>", $exception->getCode()); 
      $result .= sprintf("<div><b>File: </b> %s</div>", $exception->getFile()); 
      $result .= sprintf("<div><b>Line: </b> %s</div>", $exception->getLine()); 
      $result .= sprintf("<div><b>Trace: </b></div>"); 
      $result .= sprintf('<div style="padding-left: 20px;">'); 
      foreach ($exception->getTrace() as $trace) 
      { 
       $result .= sprintf('<div style="border: 1px solid #000;margin-top: 10px;">'); 
       $result .= sprintf("<div><b>File: </b> %s</div>", $trace['file']); 
       $result .= sprintf("<div><b>Line: </b> %s</div>", $trace['line']); 
       $result .= sprintf("<div><b>Function: </b> %s</div>", $trace['function']); 
       $result .= sprintf("<div><b>Class: </b> %s</div>", $trace['class']); 
       $result .= sprintf("<div><b>Type: </b> %s</div>", $trace['type']); 
       $result .= sprintf("<div><b>Args: </b></div>"); 
       $result .= sprintf('<div style="padding-left: 20px;">'); 
       foreach ($trace['args'] as $arg) 
        $result .= sprintf("<div><b>Arg: </b>%s</div>", json_encode($arg)); 
       $result .= sprintf("</div>"); 
       $result .= sprintf("</div>"); 
      } 
      $result .= sprintf("</div>"); 
      if (get_class($exception) === "PDOException") 
      { 
       $result .= sprintf("<br />"); 
       $result .= sprintf("<div><b>PDO: </b></div>"); 
       $result .= sprintf('<div style="padding-left: 20px;">'); 
       $result .= sprintf("<div><b>Code: </b> %s</div>", $exception->errorInfo[0]); 
       $result .= sprintf("<div><b>Driver code: </b> %s</div>", $exception->errorInfo[1]); 
       $result .= sprintf("<div><b>Message: </b> %s</div>", $exception->errorInfo[2]); 
       $result .= sprintf("</div>"); 
      } 

      $prev = $exception->getPrevious(); 
      if (isset($prev)) 
       $result .= self::FormatException($prev, $level++); 
      $result .= sprintf("</div>"); 
      $result .= sprintf("<br />"); 

      return $result; 
     } 
0
<?php 
    // Defining the handlers. 
    register_shutdown_function('FatalErrorHandler'); 
    set_error_handler(   'ErrorHandler'  ); 

    function ErrorHandler($iNumber, $sMessage, $sFile, $sLine, array $aContext) 
    { 
     $aLastError = error_get_last(); 

     // If we have a fatal error let the fatal handler take care of it. 
     // Required otherwise dual logs will occur as both handlers are called. 
     if ($aLastError === NULL) 
     { 

      $aError = array(); 
      $aError[ 'error' ][ 'code' ] = $iNumber; 
      $aError[ 'error' ][ 'msg'  ] = $sMessage; 
      $aError[ 'error' ][ 'file' ] = $sFile; 
      $aError[ 'error' ][ 'line' ] = $sLine; 
      $aError[ 'error' ][ 'context' ] = $aContext; 

      // Remove output. 
      ob_clean(); 

      $sOutputMsg = 'Error \'' . $iNumber . '\' occurred in ' . $sFile . 
       ' on line ' . $sLine . ' Message: ' . $sMessage; 

      $sTrace = ''; 
      $aTrace = debug_backtrace(); 
      $iCountTraces = count($aTrace); 
      for($i = 0; $i < $iCountTraces; ++$i) 
      { 

       $sTrace .= '<h3>Trace ' 
        . $i 
        . '</h3><div><pre>' 
        . print_r($aTrace[ $i ], true) 
        . '</pre></div>'; 
      } 
      $sFullMessage = '<div id="top">' 
       . $sOutputMsg 
       . '<br />Error: ' 
       . $iNumber 
       . '<br />File: ' 
       . $sFile 
       . '<br />Line: ' 
       . $sLine 
       . '<br />' 
       . $sMessage 
       . '<br/ ></div><div id="trace">Context: <pre>' 
       . print_r($aContext, true) 
       . '</pre><br/>Stacktrace: ' 
       . '<br />' 
       . $sTrace; 
      var_dump($sFullMessage); 
      // Log($sFullMessage); 
     } 
    } 

    function FatalErrorHandler() 
    { 
     $aLastError = error_get_last(); 

     // Ensure this is a fatal error otherwise let errorhandler handle it. 
     if (($aLastError[ 'type' ] === E_ERROR) || ($aLastError[ 'type' ] === E_USER_ERROR)) 
     { 
      // Remove output. 
      ob_clean(); 

      // Ensure we had data inside error get last. 
      $sType = empty($aLastError[ 'type' ]) ? '' : $aLastError[ 'type' ]; 
      $sFile = empty($aLastError[ 'file' ]) ? '' : $aLastError[ 'file' ]; 
      $sLine = empty($aLastError[ 'line' ]) ? '' : $aLastError[ 'line' ]; 
      $sMsg = empty($aLastError[ 'msg' ] ) ? '' : $aLastError[ 'msg' ]; 

      $sFullMessage = 'Fatal Error \'' 
       . $sType 
       . '\' occurred in ' 
       . $sFile 
       . ' on line ' 
       . $sLine 
       . '<br />Message: ' 
       . $sMsg; 

      // Fatal errors don't have a stacktrace. 
      var_dump($sFullMessage); 
      // Log($sFullMessage); 
     } 
    } 
    // Examples: 

    // Fatal error throw 
    $oTmp = NULL; 
    $oTmp->hey(); 

    // Error throw 
    // e 
?> 
Смежные вопросы