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 中对异常处理的部分代码
- /*
 - * ------------------------------------------------------
 - * Define a custom error handler so we can log PHP errors
 - * ------------------------------------------------------
 - */
 - set_error_handler('_error_handler');
 - set_exception_handler('_exception_handler');
 - register_shutdown_function('_shutdown_handler');
 - ...
 
以上括号内的方法均在common.php中以function_exists为前提声明。
- if ( ! function_exists('_exception_handler'))
 - {
 - ...
 
代码实现
我们简单粗暴的在项目入口文件index.php中重写以下方法
- /**
 - * 推送到redis 异常队列
 - * @time 2019/3/21 15:29
 - * @author
 - * @param $msg
 - * @return bool|int|string
 - */
 - function redis_list_add($msg)
 - {
 - ini_set('default_socket_timeout', -1);
 - $v = explode(':', $_SERVER['SITE_REDIS_SERVER']);
 - if (is_array($v) && !emptyempty($v)) {
 - try {
 - $redis = new redis();
 - $redis->pconnect($v[0], $v[1]);
 - $trace = $_SERVER['SERVER_NAME'] . " exception\n";
 - $trace .= "clint ip is {$_SERVER['REMOTE_ADDR']} " . ",server is " . $_SERVER['SERVER_NAME'] . "(" . $_SERVER['SERVER_ADDR'] . ")"."\n";
 - $trace.= "path is ".(isset($_SERVER['REQUEST_URI'])?$_SERVER['REQUEST_URI']:"empty")."\n";
 - $trace .= "request params is =" . print_r($_POST, true);
 - return $redis->LPUSH('PHP_ERROR_WARNING', $trace . $msg);
 - } catch (Exception $e) {
 - return $e->getMessage();
 - }
 - }
 - }
 - /**
 - * 优先重写common.php中对应方法
 - * @time 2019/3/21 16:19
 - * @author
 - * @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);
 - if ($is_error) {
 - $error_msg = ($message . "\n" . $filepath . "\n" . $line);
 - redis_list_add($error_msg);
 - exit(json_encode(['success' => '-1', 'code' => 501, 'msg' => 'error']));
 - }
 - }
 - /**
 - * 捕获php本身语法,对象调用,参数类型传递等错误
 - * 优先重写common.php中对应方法
 - * ParseError,object(Error),TypeError,Error
 - * @time 2019/3/20 18:33
 - * @author
 - * @param $exception
 - */
 - function _exception_handler($exception)
 - {
 - $_tmp =& load_class('Exceptions', 'core');
 - if (!emptyempty($exception)) {
 - $error_msg = ($exception->getMessage() . "\n" . $exception->getTraceAsString());
 - redis_list_add($error_msg);
 - exit(json_encode(['success' => '-1', 'code' => 501, 'msg' => 'exception']));
 - }
 - }
 - /**
 - * 优先重写common.php中对应方法
 - * require_once('no_exists.php')
 - * @time 2019/3/21 9:49
 - * @author
 - */
 - function _shutdown_handler()
 - {
 - $last_error = error_get_last();
 - if (isset($last_error) &&
 - ($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING))) {
 - redis_list_add($msg = $last_error['message'] . "\n" . $last_error['file'] . "\n" . $last_error['line'] . "\n");
 - exit(json_encode(['success' => '-1', 'code' => 501, 'msg' => 'shutdown']));
 - }
 - }
 - /**
 - * 优先重写common.php中对应方法
 - * ci 框架内部的load异常、config异常、loader异常等会自动抛出,
 - * 但common.php中的函数定义之类错误无法捕捉
 - * @time 2019/3/20 18:46
 - * @author
 - * @param $message
 - * @param int $status_code
 - */
 - function show_error($message)
 - {
 - redis_list_add($message);
 - exit(json_encode(['success' => '-1', 'code' => '503', 'msg' => 'ci_exception_1']));
 - }
 - /**
 - * 优先重写common.php中对应方法
 - * @time 2019/3/21 15:34
 - * @author
 - * @param string $page
 - */
 - function show_404($page = '')
 - //phpfensi.com
 - {
 - redis_list_add("url: " . $page . " not found");
 - exit(json_encode(['success' => '-1', 'code' => '404', 'msg' => 'Not Found']));
 - }
 
Tags: CodeIgniter3 0
相关文章
- ·解决MAGENTO报500服务器错误的方法(2014-12-02)
 - ·Drupal站点换服务器后除主页其他404错误如何解决(2015-05-07)
 - ·Cordova 5.0 无法访问外网,404错误的解决办法(2015-08-21)
 - ·yii2.0之GridView自定义按钮和链接用法(2021-05-03)
 - ·Yii2.0高级框架数据库增删改查的一些操作(2021-06-26)
 - ·实例讲解yii2.0在php命令行中运行的步骤(2021-06-27)
 - ·yii2.0使用Plupload实现带缩放功能的多图上传(2021-06-30)
 - ·yii2.0实现验证用户名与邮箱功能(2021-06-30)
 - ·YII2.0之Activeform表单组件用法实例(2021-07-05)
 - ·Yii2.0实现生成二维码功能实例(2021-08-16)
 - ·Swoole 1.10.0新版本发布,增加了多项新特性(2021-08-29)
 - ·Yii2.0 RESTful API 基础配置教程详解(2021-11-03)
 - ·Yii2.0框架实现带分页的多条件搜索功能示例(2021-11-10)
 - ·Laravel5.0+框架邮件发送功能实现方法图文与实例详解(2021-11-20)
 - ·Yii2.0框架模型多表关联查询示例(2021-12-05)
 - ·Yii2.0框架模型添加/修改/删除数据操作示例(2021-12-05)
 
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
 - PHP新手上路(一)(7)
 - 惹恼程序员的十件事(5)
 - PHP邮件发送例子,已测试成功(5)
 - 致初学者:PHP比ASP优秀的七个理由(4)
 - PHP会被淘汰吗?(4)
 - PHP新手上路(四)(4)
 - 如何去学习PHP?(2)
 - 简单入门级php分页代码(2)
 - php中邮箱email 电话等格式的验证(2)
 
