背景ci3.0框架核心代码自动实现异常,并实现抛出的相应页面和方法。对于一些个性化的需求,尤其是接口类型的应用,就不适合了。因此,需要在不修改核心代码(系统目录下的文件)的情况下,更改对异常和404等相关异常的处理。方法说明CI框架3.0相比2.0有比较大的变化,其中之一就是对异常的处理。以下是CodeIgniter-3.1.8\system\core\CodeIgniter.php中异常处理的部分代码/**----------------------------------------------------*定义自定义错误处理程序,以便我们可以记录PHP错误*----------------------------------------------------*/set_error_handler('_error_handler');set_exception_handler('_exception_handler');register_shutdown_function('_shutdown_handler');...以上括号中的方法都是以function_exists为前提在common.php中声明的。...if(!function_exists('_exception_handler')){...代码实现我们在项目入口文件index.php中简单粗暴的重写了如下方法/***推送到rediscc异常队列*@time2019/3/2115:29*@authortongbo*@param$msg*@param$error_type*@param$error_code*@returnbool|int|string*/functionredis_list_add($msg,$error_type,$error_code){ini_set('default_socket_timeout',-1);$v=explode(':',$_SERVER['SITE_REDIS_SERVER']);如果(is_array($v)&&!empty($v)){try{$redis=newredis();$redis->pconnect($v[0],$v[1]);$空间="\n\n";$跟踪=“”;if($error_code){$trace.="状态代码:".$error_code。"\n";}if($error_type){$trace.="错误类型:".$错误类型。"\n";}$trace.=“客户端IP:”。$_SERVER['REMOTE_ADDR']。"\n";$trace.=“服务器IP:”。$_SERVER['SERVER_NAME']。"(".$_SERVER['SERVER_ADDR'].")"."\n";$跟踪e.="请求地址:".(isset($_SERVER['REQUEST_URI'])?$_SERVER['REQUEST_URI']:“空”)。"\n";$trace.="请求参数:=".print_r($_REQUEST?$_REQUEST:$_GET,true)。"\n";返回$redis->LPUSH('CC_PHP_ERROR_WARNING',$space.$msg.$space.$trace);}catch(Exception$e){返回$e->getMessage();}}}/***优先重写common.php中对应的方法*捕获语法错误*@time2019/3/2116:19*@authortongbo*@param$severity*@param$message*@param$filepath*@param$line*/function_error_handler($severity,$message,$filepath,$line){$is_error=(((E_ERROR|E_PARSE|E_COMPILE_ERROR|E_CORE_ERROR|E_USER_ERROR|E_STRICT)&$severity)===$severity);如果($is_error){$error_msg=$message."\n"。$文件路径。"\n"。$行;$error_code="501";redis_list_add($error_msg,'Error_Handler异常',$error_code);退出(json_encode(['成功'=>'-1','代码'=>$error_code,'msg'=>'错误']));}}/***捕获php语法、对象调用、参数类型传递等错误*优先重写common.php中对应的方法*ParseError,object(Error),TypeError,Error*@time2019/3/2018:33*@authortongbo*@param$exception*/function_exception_handler($exception){if(!empty($exception)){$error_type=get_class($exception);}$error_msg="错误类型:{$error_type};文件名:{$exception->getFile()};行号:{$exception->getLine()};错误信息:{$exception->getMessage()};";$error_code="502";redis_list_add($error_msg,$error_type,$error_code);退出(json_encode(['成功'=>'-1','代码'=>$error_code,'msg'=>'异常']));}}/***优先重写common.php中对应的方法*require_once('no_exists.php')*@time2019/3/219:49*@authortogbo*/function_shutdown_handler(){$last_error=error_get_last();如果(isset($last_error)&&($last_error['type']&(E_ERROR|E_PARSE|E_CORE_ERROR|E_CORE_WARNING|E_COMPILE_ERROR|E_COMPILE_WARNING))){$error_msg="错误类型:关闭;>文件名:{$last_error['file']};行号:{$last_error['line']};错误信息:{$last_error['message']};";$error_code="503";redis_list_add($error_msg,'Shut_Down异常',$error_code);退出(json_encode(['成功'=>'-1','代码'=>$error_code,'味精'=>'关机']));}}/***优先重写common.php中对应的方法*ci框架内部的load异常、config异常、loader异常等会自动抛出,*但不能抛出.php中函数定义等常见错误caught*@time2019/3/2018:46*@authortongbo*@param$message*@paramint$status_code*/functionshow_error($message){$error_msg="错误信息:{$message};";$error_code="504";redis_list_add($error_msg,'帧加载异常',$error_code);exit(json_encode(['success'=>'-1','code'=>$error_code,'msg'=>'ci_exception_1']));}/***优先重写common.php中对应的方法*@time2019/3/2115:34*@authortongbo*@paramstring$page*/functionshow_404($page=''){$error_msg="错误信息:请求的URL:".$页。“404未找到”;$error_code="404";redis_list_add($error_msg,'文件不存在',$error_code);exit(json_encode(['success'=>'-1','code'=>$error_code,'msg'=>'NotFound']));}扩展可以处理基类中的错误级别并区分处理写错误处理到其他地方,require_once进来
