<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. php語言

    顯示效果不錯的PHP錯誤 異常處理類

    時間:2025-02-05 10:27:30 php語言 我要投稿
    • 相關推薦

    顯示效果不錯的PHP錯誤 異常處理類

      奮斗的雙腳在踏碎自己的溫床時,卻開拓了一條創造之路。以下是小編為大家搜索整理的顯示效果不錯的PHP錯誤 異常處理類,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!

    顯示效果不錯的PHP錯誤 異常處理類

      一、效果圖:

      二、實現代碼

      代碼如下:

      // 自定義異常函數

      set_exception_handler('handle_exception');

      // 自定義錯誤函數

      set_error_handler('handle_error');

      /**

      * 異常處理

      *

      * @param mixed $exception 異常對象

      * @author blog.snsgou.com

      */

      function handle_exception($exception) {

      Error::exceptionError($exception);

      }

      /**

      * 錯誤處理

      *

      * @param string $errNo 錯誤代碼

      * @param string $errStr 錯誤信息

      * @param string $errFile 出錯文件

      * @param string $errLine 出錯行

      * @author blog.snsgou.com

      */

      function handle_error($errNo, $errStr, $errFile, $errLine) {

      if ($errNo) {

      Error::systemError($errStr, false, true, false);

      }

      }

      /**

      * 系統錯誤處理

      *

      * @author blog.snsgou.com

      */

      class Error {

      public static function systemError($message, $show = true, $save = true, $halt = true) {

      list($showTrace, $logTrace) = self::debugBacktrace();

      if ($save) {

      $messageSave = '' . $message . '

      PHP:' . $logTrace;

      self::writeErrorLog($messageSave);

      }

      if ($show) {

      self::showError('system', "

      $message

      ", $showTrace, 0);

      }

      if ($halt) {

      exit();

      } else {

      return $message;

      }

      }

      /**

      * 代碼執行過程回溯信息

      *

      * @static

      * @access public

      */

      public static function debugBacktrace() {

      $skipFunc[] = 'Error->debugBacktrace';

      $show = $log = '';

      $debugBacktrace = debug_backtrace();

      ksort($debugBacktrace);

      foreach ($debugBacktrace as $k => $error) {

      if (!isset($error['file'])) {

      // 利用反射API來獲取方法/函數所在的文件和行數

      try {

      if (isset($error['class'])) {

      $reflection = new ReflectionMethod($error['class'], $error['function']);

      } else {

      $reflection = new ReflectionFunction($error['function']);

      }

      $error['file'] = $reflection->getFileName();

      $error['line'] = $reflection->getStartLine();

      } catch (Exception $e) {

      continue;

      }

      }

      $file = str_replace(SITE_PATH, '', $error['file']);

      $func = isset($error['class']) ? $error['class'] : '';

      $func .= isset($error['type']) ? $error['type'] : '';

      $func .= isset($error['function']) ? $error['function'] : '';

      if (in_array($func, $skipFunc)) {

      break;

      }

      $error['line'] = sprintf('%04d', $error['line']);

      $show .= '

      [Line: ' . $error['line'] . ']' . $file . '(' . $func . ')

      ';

      $log .= !empty($log) ? ' -> ' : '';

      $log .= $file . ':' . $error['line'];

      }

      return array($show, $log);

      }

      /**

      * 異常處理

      *

      * @static

      * @access public

      * @param mixed $exception

      */

      public static function exceptionError($exception) {

      if ($exception instanceof DbException) {

      $type = 'db';

      } else {

      $type = 'system';

      }

      if ($type == 'db') {

      $errorMsg = '(' . $exception->getCode() . ') ';

      $errorMsg .= self::sqlClear($exception->getMessage(), $exception->getDbConfig());

      if ($exception->getSql()) {

      $errorMsg .= '

      ';

      $errorMsg .= self::sqlClear($exception->getSql(), $exception->getDbConfig());

      $errorMsg .= '

      ';

      }

      } else {

      $errorMsg = $exception->getMessage();

      }

      $trace = $exception->getTrace();

      krsort($trace);

      $trace[] = array('file' => $exception->getFile(), 'line' => $exception->getLine(), 'function' => 'break');

      $phpMsg = array();

      foreach ($trace as $error) {

      if (!empty($error['function'])) {

      $fun = '';

      if (!empty($error['class'])) {

      $fun .= $error['class'] . $error['type'];

      }

      $fun .= $error['function'] . '(';

      if (!empty($error['args'])) {

      $mark = '';

      foreach ($error['args'] as $arg) {

      $fun .= $mark;

      if (is_array($arg)) {

      $fun .= 'Array';

      } elseif (is_bool($arg)) {

      $fun .= $arg ? 'true' : 'false';

      } elseif (is_int($arg)) {

      $fun .= (defined('SITE_DEBUG') && SITE_DEBUG) ? $arg : '%d';

      } elseif (is_float($arg)) {

      $fun .= (defined('SITE_DEBUG') && SITE_DEBUG) ? $arg : '%f';

      } else {

      $fun .= (defined('SITE_DEBUG') && SITE_DEBUG) ? ''' . htmlspecialchars(substr(self::clear($arg), 0, 10)) . (strlen($arg) > 10 ? ' ...' : '') . ''' : '%s';

      }

      $mark = ', ';

      }

      }

      $fun .= ')';

      $error['function'] = $fun;

      }

      if (!isset($error['line'])) {

      continue;

      }

      $phpMsg[] = array('file' => str_replace(array(SITE_PATH, ''), array('', '/'), $error['file']), 'line' => $error['line'], 'function' => $error['function']);

      }

      self::showError($type, $errorMsg, $phpMsg);

      exit();

      }

      /**

      * 記錄錯誤日志

      *

      * @static

      * @access public

      * @param string $message

      */

      public static function writeErrorLog($message) {

      return false; // 暫時不寫入

      $message = self::clear($message);

      $time = time();

      $file = LOG_PATH . '/' . date('Y.m.d') . '_errorlog.php';

      $hash = md5($message);

      $userId = 0;

      $ip = get_client_ip();

      $user = 'User: userId=' . intval($userId) . '; IP=' . $ip . '; RIP:' . $_SERVER['REMOTE_ADDR'];

      $uri = 'Request: ' . htmlspecialchars(self::clear($_SERVER['REQUEST_URI']));

      $message = "t{$time}t$messaget$hasht$user $urin";

      // 判斷該$message是否在時間間隔$maxtime內已記錄過,有,則不用再記錄了

      if (is_file($file)) {

      $fp = @fopen($file, 'rb');

      $lastlen = 50000; // 讀取最后的 $lastlen 長度字節內容

      $maxtime = 60 * 10; // 時間間隔:10分鐘

      $offset = filesize($file) - $lastlen;

      if ($offset > 0) {

      fseek($fp, $offset);

      }

      if ($data = fread($fp, $lastlen)) {

      $array = explode("n", $data);

      if (is_array($array))

      foreach ($array as $key => $val) {

      $row = explode("t", $val);

      if ($row[0] != '') {

      continue;

      }

      if ($row[3] == $hash && ($row[1] > $time - $maxtime)) {

      return;

      }

      }

      }

      }

      error_log($message, 3, $file);

      }

      /**

      * 清除文本部分字符

      *

      * @param string $message

      */

      public static function clear($message) {

      return str_replace(array("t", "r", "n"), " ", $message);

      }

      /**

      * sql語句字符清理

      *

      * @static

      * @access public

      * @param string $message

      * @param string $dbConfig

      */

      public static function sqlClear($message, $dbConfig) {

      $message = self::clear($message);

      if (!(defined('SITE_DEBUG') && SITE_DEBUG)) {

      $message = str_replace($dbConfig['database'], '***', $message);

      //$message = str_replace($dbConfig['prefix'], '***', $message);

      $message = str_replace(C('DB_PREFIX'), '***', $message);

      }

      $message = htmlspecialchars($message);

      return $message;

      }

      /**

      * 顯示錯誤

      *

      * @static

      * @access public

      * @param string $type 錯誤類型 db,system

      * @param string $errorMsg

      * @param string $phpMsg

      */

      public static function showError($type, $errorMsg, $phpMsg = '') {

      global $_G;

      $errorMsg = str_replace(SITE_PATH, '', $errorMsg);

      ob_end_clean();

      $host = $_SERVER['HTTP_HOST'];

      $title = $type == 'db' ? 'Database' : 'System';

      echo <<

      $title Error

      $errorMsg

      EOT;

      if (!empty($phpMsg)) {

      echo '

      ';

      echo '

      PHP Debug

      ';

    echo ' ';

     

      if (is_array($phpMsg)) {

      echo '

    ';

     

      foreach ($phpMsg as $k => $msg) {

      $k++;

      echo '

    ';

     

      echo '

    ';

     

      echo '

    ';

     

      echo '

    ';

     

      echo '

    ';

     

      echo '

    ';

     

      }

      } else {

      echo '

    ';

     

      }

      echo '

    No. File Line Code
    ' . $k . ' ' . $msg['file'] . ' ' . $msg['line'] . ' ' . $msg['function'] . '
      ' . $phpMsg . '

      ';

      }

      echo <<

      EOT;

      exit();

      }

      }

      /**

      * DB異常類

      *

      * @author blog.snsgou.com

      */

      class DbException extends Exception {

      protected $sql;

      protected $dbConfig; // 當前數據庫配置信息

      public function __construct($message, $code = 0, $sql = '', $dbConfig = array()) {

      $this->sql = $sql;

      $this->dbConfig = $dbConfig;

      parent::__construct($message, $code);

      }

      public function getSql() {

      return $this->sql;

      }

      public function getDbConfig() {

      return $this->dbConfig;

      }

      }

    【顯示效果不錯的PHP錯誤 異常處理類】相關文章:

    PHP異常處理辦法08-08

    如何處理PHP異常06-01

    PHP7的異常處理詳解05-10

    php中屏蔽與顯示錯誤消息06-24

    PHP7系列之異常處理08-15

    PHP5異常處理分析實例08-07

    PHP7系列中的異常處理08-11

    PHP7系列之-異常處理06-07

    PHP學習入門之PHP錯誤處理07-14

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人