Advertisement
Guest User

Andrew Moore

a guest
Jul 17th, 2009
1,239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.32 KB | None | 0 0
  1. <?php
  2. define('HANDLER_NORMAL', 0);
  3.  
  4. define('HANDLER_EXIT_FUNCTION', 1);
  5. define('HANDLER_EXIT_CLASS', 2);
  6.  
  7. require_once ABSPATH . "includes/framework/functions/SiteLog.php";
  8.  
  9. class ErrorHandler {
  10.     public static $DBfatal = true;
  11.     public static $DBsilent = false;
  12.  
  13.     public static function custom_error_handler($code, $message, $type = 0) {
  14.         ErrorHandler::handle($code, $message, ErrorHandler::get_backtrace($type));
  15.     }
  16.  
  17.     public static function php_error_handler($code, $message) {
  18.         ErrorHandler::handle($code, $message, ErrorHandler::get_backtrace(0));
  19.     }
  20.  
  21.     public static function pear_error_handler($err) {
  22.         if (@is_a($err, 'MDB2_Error')) {
  23.             if (!ErrorHandler::$DBsilent) {
  24.                 $level = (ErrorHandler::$DBfatal) ? E_USER_ERROR : E_USER_WARNING;
  25.  
  26.                 if ($err->userinfo) {
  27.                     ErrorHandler::log(PEAR_LOG_NOTICE, trim(str_replace(array
  28.                         (
  29.                         "\n",
  30.                         "\r"
  31.                         ), array
  32.                         (
  33.                         ' ',
  34.                         ''
  35.                         ), $err->userinfo)));
  36.                 }
  37.  
  38.                 ErrorHandler::handle($level, $err->message, ErrorHandler::get_backtrace(HANDLER_EXIT_CLASS));
  39.             }
  40.         } else ErrorHandler::handle($err->level, $err->message, ErrorHandler::get_backtrace(HANDLER_EXIT_CLASS));
  41.     }
  42.  
  43.     public static function php_exception_handler($err) {
  44.         ErrorHandler::handle(E_ERROR, $err->getMessage(), ErrorHandler::get_backtrace(HANDLER_EXIT_CLASS));
  45.     }
  46.  
  47.     private static function get_backtrace($type = 0) {
  48.         $regEx = "/^" . preg_quote(ABSPATH, '/') . '/' . ((server_is_windows()) ? 'i' : '');
  49.  
  50.         $tmp = debug_backtrace();
  51.         $backtrace = array();
  52.  
  53.         for ($i = 0; $i < count($tmp); $i++) {
  54.             unset ($tmp[$i]['object']);
  55.  
  56.             if ($tmp[$i]['file']) {
  57.                 $tmp[$i]['file'] = str_replace('\\', '/', $tmp[$i]['file']);
  58.  
  59.                 if (preg_match($regEx, $tmp[$i]['file'])) {
  60.                     $tmp[$i]['file'] = preg_replace($regEx, '', $tmp[$i]['file']);
  61.                 }
  62.             }
  63.  
  64.             if (count($backtrace) == 0) {
  65.                 $isMyHandler = ($tmp[$i]['file'] == 'includes/framework/functions/ErrorHandler.php' || $tmp[$i]['class'] == 'ErrorHandler' || $tmp[$i]['function'] == 'trigger_php_error');
  66.                 $isPearError = (!is_null($tmp[$i]['class']) && ($tmp[$i]['class'] == 'PEAR_Error' || is_subclass_of($tmp[$i]['class'], 'PEAR_Error')));
  67.                 $isCallback = ($tmp[$i]['function'] == 'call_user_func' && (is_array($tmp[$i]['args'][0]) && $tmp[$i]['args'][0][0] == 'ErrorHandler'));
  68.                 $isSomeHandler = (!is_null($tmp[$i]['function']) && stripos($tmp[$i]['function'], 'error') !== FALSE);
  69.                 $isLast = ($i == (count($tmp) - 1));
  70.  
  71.                 if (!($isMyHandler || $isPearError || $isCallback || $isSomeHandler) || $isLast) {
  72.                     $backtrace[] = $tmp[$i];
  73.                 }
  74.             } else {
  75.                 $backtrace[] = $tmp[$i];
  76.             }
  77.         }
  78.  
  79.         switch ($type)
  80.             {
  81.             case HANDLER_EXIT_FUNCTION:
  82.                 array_shift ($backtrace);
  83.                 break;
  84.  
  85.             case HANDLER_EXIT_CLASS:
  86.                 $orgClass = $backtrace[0]['class'];
  87.  
  88.                 if (!is_null($orgClass)) {
  89.                     while (count($backtrace) > 1 && $backtrace[1]['class'] == $orgClass) {
  90.                         array_shift ($backtrace);
  91.                     }
  92.                 }
  93.                 break;
  94.             }
  95.  
  96.         return $backtrace;
  97.     }
  98.  
  99.     private static function handle($code, $message, $backtrace) {
  100.         $logPriority = PEAR_LOG_INFO;
  101.  
  102.         switch ($code)
  103.             {
  104.             case E_ERROR:
  105.             case E_USER_ERROR:
  106.                 if ((error_reporting() & E_ERROR) == 0) exit (1);
  107.  
  108.                 $logPriority = PEAR_LOG_ERR;
  109.                 break;
  110.  
  111.             case E_RECOVERABLE_ERROR:
  112.                 if ((error_reporting() & E_RECOVERABLE_ERROR) == 0) exit (1);
  113.  
  114.                 $logPriority = PEAR_LOG_ERR;
  115.                 break;
  116.  
  117.             case E_WARNING:
  118.             case E_USER_WARNING:
  119.                 if ((error_reporting() & E_WARNING) == 0) return false;
  120.  
  121.                 $logPriority = PEAR_LOG_WARNING;
  122.                 break;
  123.  
  124.             case E_NOTICE:
  125.             case E_USER_NOTICE:
  126.                 if ((error_reporting() & E_NOTICE) == 0) return false;
  127.  
  128.                 $logPriority = PEAR_LOG_NOTICE;
  129.                 break;
  130.  
  131.             case E_STRICT:
  132.                 if ((error_reporting() & E_STRICT) == 0) return false;
  133.                 $message = 'Strict: ' . $message;
  134.                 $logPriority = PEAR_LOG_NOTICE;
  135.                 break;
  136.  
  137.             case E_DEPRECATED:
  138.             case E_USER_DEPRECATED:
  139.                 if ((error_reporting() & E_DEPRECATED) == 0) return false;
  140.                 $message = 'Deprecated: ' . $message;
  141.                 $logPriority = PEAR_LOG_NOTICE;
  142.                 break;
  143.  
  144.             default:
  145.                 if ((error_reporting() & $code) == 0) return false;
  146.  
  147.                 $logPriority = PEAR_LOG_NOTICE;
  148.                 break;
  149.             }
  150.  
  151.         $message = strip_tags($message);
  152.         $logText = $message . ' in ' . $backtrace[0]['file'] . ' at line ' . $backtrace[0]['line'];
  153.  
  154.         ErrorHandler::log($logPriority, $logText);
  155.         ErrorHandler::write_dump($code, $message, $backtrace);
  156.  
  157.         if ($code == E_USER_ERROR || $code == E_ERROR) exit (1);
  158.         return true;
  159.     }
  160.  
  161.     private static function log($priority, $message) {
  162.         $logger = &SiteLog::get('php_sapi', true, SERVERTYPE == 'PROD');
  163.         $logger->log($message, $priority);
  164.     }
  165.  
  166.     private static function write_dump($code, $message, $backtrace) {
  167.         global $argv;
  168.  
  169.         $filename = date('YmdHis');
  170.         $codeName = 'Unknown';
  171.  
  172.         switch ($code)
  173.             {
  174.             case E_ERROR:
  175.             case E_USER_ERROR:
  176.                 $codeName = 'Error';
  177.                 break;
  178.  
  179.             case E_RECOVERABLE_ERROR:
  180.                 $codeName = 'Recoverable Error';
  181.                 break;
  182.  
  183.             case E_WARNING:
  184.             case E_USER_WARNING:
  185.                 $codeName = 'Warning';
  186.                 break;
  187.  
  188.             case E_NOTICE:
  189.             case E_USER_NOTICE:
  190.                 $codeName = 'Notice';
  191.                 break;
  192.  
  193.             case E_STRICT:
  194.                 $codeName = 'Strict';
  195.                 break;
  196.  
  197.             case E_DEPRECATED:
  198.             case E_USER_DEPRECATED:
  199.                 $codeName = 'Deprecated';
  200.                 break;
  201.  
  202.                 default:
  203.             $codeName = 'Unknown';
  204.                 break;
  205.             }
  206.  
  207.         $loginfo['type'] = $codeName;
  208.         $loginfo['msg'] = $message;
  209.         $loginfo['cli'] = ISCLI;
  210.  
  211.         if ($loginfo['cli']) {
  212.             $loginfo['argv'] = $argv;
  213.         } else {
  214.             $loginfo['request'] = @substr($_SERVER['REQUEST_URI'], strlen(RELADDR));
  215.             $loginfo['get'] = $_GET;
  216.             $loginfo['post'] = $_POST;
  217.         }
  218.  
  219.         $loginfo['backtrace'] = $backtrace;
  220.  
  221.         $logstr = Spyc::YAMLDump($loginfo, false, 0);
  222.  
  223.         file_put_contents(sprintf("%sautomation/logs/error_dumps/%s_%s.log", ABSPATH, $filename, sha1($logstr)), $logstr);
  224.     }
  225. }
  226.  
  227. function trigger_php_error($message, $level, $mode = 0) {
  228.     ErrorHandler::custom_error_handler($level, $message, $mode);
  229. }
  230.  
  231. ini_set('track_errors', 1);
  232. set_error_handler (array
  233.     (
  234.     'ErrorHandler',
  235.     'php_error_handler'
  236.     ));
  237.  
  238. set_exception_handler (array
  239.     (
  240.     'ErrorHandler',
  241.     'php_exception_handler'
  242.     ));
  243.  
  244. PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array
  245.     (
  246.     'ErrorHandler',
  247.     'pear_error_handler'
  248.     ));
  249. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement