当前位置:首页 > CMS教程 > 其它CMS > 列表

CodeIgniter3.0+框架自定义异常处理的方法介绍

发布:smiling 来源: PHP粉丝网  添加日期:2020-02-08 17:04:50 浏览: 评论:0 

本篇文章给大家带来的内容是关于CodeIgniter3.0+框架自定义异常处理的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

背景:ci3.0框架核心代码自动实现了异常,并实现了抛出的对应页面和方法,对于一些个性化需求特别是接口类型的应用,会不合适。因此需要在不改版核心代码 (system目录下文件),来改变对异常及404等相关异常的处理。

方法说明

ci框架3.0比2.0有比较大的改动,其中之一就是对异常的处理。以下是CodeIgniter-3.1.8\system\core\CodeIgniter.php 中对异常处理的部分代码

  1. /* 
  2.  
  3.  * ------------------------------------------------------ 
  4.  
  5.  *  Define a custom error handler so we can log PHP errors 
  6.  
  7.  * ------------------------------------------------------ 
  8.  
  9.  */ 
  10.  
  11.     set_error_handler('_error_handler'); 
  12.  
  13.     set_exception_handler('_exception_handler'); 
  14.  
  15.     register_shutdown_function('_shutdown_handler'); 
  16.  
  17. ... 

以上括号内的方法均在common.php中以function_exists为前提声明。

  1. if ( ! function_exists('_exception_handler')) 
  2.  
  3.  
  4. ... 

代码实现

我们简单粗暴的在项目入口文件index.php中重写以下方法

  1. /** 
  2.  
  3.  * 推送到redis 异常队列 
  4.  
  5.  * @time 2019/3/21 15:29 
  6.  
  7.  * @author  
  8.  
  9.  * @param $msg 
  10.  
  11.  * @return bool|int|string 
  12.  
  13.  */ 
  14.  
  15. function redis_list_add($msg
  16.  
  17.  
  18.     ini_set('default_socket_timeout', -1); 
  19.  
  20.     $v = explode(':'$_SERVER['SITE_REDIS_SERVER']); 
  21.  
  22.     if (is_array($v) && !emptyempty($v)) { 
  23.  
  24.         try { 
  25.  
  26.             $redis = new redis(); 
  27.  
  28.             $redis->pconnect($v[0], $v[1]); 
  29.  
  30.             $trace = $_SERVER['SERVER_NAME'] . " exception\n"
  31.  
  32.             $trace .= "clint ip is  {$_SERVER['REMOTE_ADDR']} " . ",server is " . $_SERVER['SERVER_NAME'] . "(" . $_SERVER['SERVER_ADDR'] . ")"."\n"
  33.  
  34.             $trace.= "path is ".(isset($_SERVER['REQUEST_URI'])?$_SERVER['REQUEST_URI']:"empty")."\n"
  35.  
  36.             $trace .= "request params is =" . print_r($_POST, true); 
  37.  
  38.             return $redis->LPUSH('PHP_ERROR_WARNING'$trace . $msg); 
  39.  
  40.         } catch (Exception $e) { 
  41.  
  42.             return $e->getMessage(); 
  43.  
  44.         } 
  45.  
  46.     } 
  47.  
  48.  
  49.  
  50.  
  51. /** 
  52.  
  53.  * 优先重写common.php中对应方法 
  54.  
  55.  * @time 2019/3/21 16:19 
  56.  
  57.  * @author  
  58.  
  59.  * @param $severity 
  60.  
  61.  * @param $message 
  62.  
  63.  * @param $filepath 
  64.  
  65.  * @param $line 
  66.  
  67.  */ 
  68.  
  69. function _error_handler($severity$message$filepath$line
  70.  
  71.  
  72.     $is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR | E_STRICT) & $severity) === $severity); 
  73.  
  74.  
  75.  
  76.     if ($is_error) { 
  77.  
  78.         $error_msg = ($message . "\n" . $filepath . "\n" . $line); 
  79.  
  80.         redis_list_add($error_msg); 
  81.  
  82.         exit(json_encode(['success' => '-1''code' => 501, 'msg' => 'error'])); 
  83.  
  84.     } 
  85.  
  86.  
  87.  
  88.  
  89. /** 
  90.  
  91.  * 捕获php本身语法,对象调用,参数类型传递等错误 
  92.  
  93.  * 优先重写common.php中对应方法 
  94.  
  95.  * ParseError,object(Error),TypeError,Error 
  96.  
  97.  * @time 2019/3/20 18:33 
  98.  
  99.  * @author  
  100.  
  101.  * @param $exception 
  102.  
  103.  */ 
  104.  
  105. function _exception_handler($exception
  106.  
  107.  
  108.     $_tmp =& load_class('Exceptions''core'); 
  109.  
  110.     if (!emptyempty($exception)) { 
  111.  
  112.         $error_msg = ($exception->getMessage() . "\n" . $exception->getTraceAsString()); 
  113.  
  114.         redis_list_add($error_msg); 
  115.  
  116.         exit(json_encode(['success' => '-1''code' => 501, 'msg' => 'exception'])); 
  117.  
  118.     } 
  119.  
  120.  
  121.  
  122.  
  123. /** 
  124.  
  125.  * 优先重写common.php中对应方法 
  126.  
  127.  * require_once('no_exists.php') 
  128.  
  129.  * @time 2019/3/21 9:49 
  130.  
  131.  * @author  
  132.  
  133.  */ 
  134.  
  135. function _shutdown_handler() 
  136.  
  137.  
  138.     $last_error = error_get_last(); 
  139.  
  140.     if (isset($last_error) && 
  141.  
  142.         ($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING))) { 
  143.  
  144.         redis_list_add($msg = $last_error['message'] . "\n" . $last_error['file'] . "\n" . $last_error['line'] . "\n"); 
  145.  
  146.         exit(json_encode(['success' => '-1''code' => 501, 'msg' => 'shutdown'])); 
  147.  
  148.     } 
  149.  
  150.  
  151.  
  152.  
  153. /** 
  154.  
  155.  * 优先重写common.php中对应方法 
  156.  
  157.  * ci 框架内部的load异常、config异常、loader异常等会自动抛出, 
  158.  
  159.  * 但common.php中的函数定义之类错误无法捕捉 
  160.  
  161.  * @time 2019/3/20 18:46 
  162.  
  163.  * @author  
  164.  
  165.  * @param $message 
  166.  
  167.  * @param int $status_code 
  168.  
  169.  */ 
  170.  
  171. function show_error($message
  172.  
  173.  
  174.     redis_list_add($message); 
  175.  
  176.     exit(json_encode(['success' => '-1''code' => '503''msg' => 'ci_exception_1'])); 
  177.  
  178.  
  179.  
  180.  
  181. /** 
  182.  
  183.  * 优先重写common.php中对应方法 
  184.  
  185.  * @time 2019/3/21 15:34 
  186.  
  187.  * @author  
  188.  
  189.  * @param string $page 
  190.  
  191.  */ 
  192.  
  193. function show_404($page = ''
  194. //phpfensi.com 
  195.  
  196.     redis_list_add("url: " . $page . " not found"); 
  197.  
  198.     exit(json_encode(['success' => '-1''code' => '404''msg' => 'Not Found'])); 
  199.  

Tags: CodeIgniter3.0

分享到: