Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Andrew Moore

By: a guest on Jul 17th, 2009  |  syntax: PHP  |  size: 6.32 KB  |  views: 395  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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.         (
  233.         'ErrorHandler',
  234.         'php_error_handler'
  235.         ));
  236.  
  237. set_exception_handler (array
  238.         (
  239.         'ErrorHandler',
  240.         'php_exception_handler'
  241.         ));
  242.  
  243. PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array
  244.         (
  245.         'ErrorHandler',
  246.         'pear_error_handler'
  247.         ));
  248. ?>