• 技术文章 >后端开发 >php教程

    为什么 同个方法中 echo realpath(RUNTIME_PATH); 会产生不同结果?

    2016-08-04 09:20:05原创901


    为了能让自定义的错误及异常处理机制能够捕获到致命错误,在thinkphp的fatalError()方法了添加了 trigger_error($e['message']);

    // 重新设置错误及异常处理机制
     set_error_handler(array('\Think\ErrorLog','phplog'));
     set_exception_handler(array('\Think\ErrorLog','phplog'));
    
    
    // 致命错误捕获
    static public function fatalError() {
        Log::save();
        if ($e = error_get_last()) {
            switch($e['type']){
              case E_ERROR:
              case E_PARSE:
              case E_CORE_ERROR:
              case E_COMPILE_ERROR:
              case E_USER_ERROR:
                ob_end_clean();
                // 抛出用户级别错误,让自定义的错误机制(phplog)能够捕获
                trigger_error($e['message']); //自己添加的
                self::halt($e);
                break;
            }
        }
    }
    

    下面是自己的错误机制

        public static function phplog($errno, $errstr = null, $errfile = null, $errline= null) {
            if($errstr === null) {                                                                                          //异常
                $backtrace = array(
                    'logType'            => 'exception',
                    'environment'        => array(
                        'code'           => $errno->getCode(),                                                              //异常代码
                        'message'        => $errno->getMessage(),                                                        //异常消息
                        'file'           => $errno->getFile(),                                                              //异常文件
                        'line'           => $errno->getLine(),                                                              //异常行
                        'debugBacktrace' => $errno->getTrace()                                                              //异常追踪
                    )
                );
            } else if( error_reporting() ) {                                                                                //常规错误
                $backtrace = array(
                    'logType'            =>'error',
                    'environment'        => array(
                        'code'           => $errno,
                        'message'        => $errstr,
                        'file'           => $errfile,
                        'line'           => $errline,
                        'debugBacktrace' => debug_backtrace()                                                               //错误回溯
                    )
                );
            } else {                                                                                                        //"@"错误
                return ;
            }
            $index = iconv('UTF-8', 'UTF-8//IGNORE', $index = &$backtrace['environment']['message']);                       //移除无效字符
            self::formatLog($backtrace);                                                                                    //格式化日志
    
            $errorLevel = array(                                                                                            //输出日志信息
                0     => 'Exception',                   //异常
                1     => 'E_ERROR',                     //致命的运行时错误。错误无法恢复。脚本的执行被中断。
                2     => 'E_WARNING',                   //非致命的运行时错误。脚本的执行不会中断。
                4     => 'E_PARSE',                     //编译时语法解析错误。解析错误只应该由解析器生成。
                8     => 'E_NOTICE',                    //运行时提示。可能是错误,也可能在正常运行脚本时发生。
                16    => 'E_CORE_ERROR',                //由 PHP 内部生成的错误。
                32    => 'E_CORE_WARNING',              //由 PHP 内部生成的警告。
                64    => 'E_COMPILE_ERROR',             //由 Zend 脚本引擎内部生成的错误。
                128   => 'E_COMPILE_WARNING',           //由 Zend 脚本引擎内部生成的警告。
                256   => 'E_USER_ERROR',                //由于调用 trigger_error() 函数生成的运行时错误。
                512   => 'E_USER_WARNING',              //由于调用 trigger_error() 函数生成的运行时警告。
                1024  => 'E_USER_NOTICE',               //由于调用 trigger_error() 函数生成的运行时提示。
                2048  => 'E_STRICT',                    //运行时提示。对增强代码的互用性和兼容性有益。
                4096  => 'E_RECOVERABLE_ERROR',         //可捕获的致命错误。
                8192  => 'E_DEPRECATED',                //运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。
                16384 => 'E_USER_DEPRECATED',           //用户产少的警告信息。
                30719 => 'E_ALL',                       //所有的错误和警告,除了 E_STRICT。
            );
            $temp = htmlentities($index, ENT_QUOTES, 'UTF-8');
            self::writeLog($backtrace, 'php', "{$errorLevel[$backtrace['environment']['code']]} : \"
    {$temp}
    \" in {$backtrace['environment']['file']} on line {$backtrace['environment']['line']}. Timestamp : {$_SERVER['REQUEST_TIME']}
    "); } protected static function writelog(&$logData, $logType, $printStr) { self::$lastError['error'] = &$logData; if( APP_DEBUG ) { //debug模式 echo $printStr; //打印日志 } $logPath = RUNTIME_PATH . 'Errorlog' . date('/Y/m/d', $_SERVER['REQUEST_TIME']) . $logType; echo realpath(RUNTIME_PATH); // 结果1.D:\wamp\www\XMQZ\Runtime 结果2.D:\wamp\Apache24\Runtime is_dir($temp = dirname($logPath)) || mkdir($temp, 0777, true); @file_put_contents( $logPath, strtr(serialize($logData), array("\r\n" => ' ' . ($temp = chr(0)), "\r" => $temp, "\n" => $temp)) . "\n", FILE_APPEND | LOCK_EX ); }

    回复内容:


    为了能让自定义的错误及异常处理机制能够捕获到致命错误,在thinkphp的fatalError()方法了添加了 trigger_error($e['message']);

    // 重新设置错误及异常处理机制
     set_error_handler(array('\Think\ErrorLog','phplog'));
     set_exception_handler(array('\Think\ErrorLog','phplog'));
    
    
    // 致命错误捕获
    static public function fatalError() {
        Log::save();
        if ($e = error_get_last()) {
            switch($e['type']){
              case E_ERROR:
              case E_PARSE:
              case E_CORE_ERROR:
              case E_COMPILE_ERROR:
              case E_USER_ERROR:
                ob_end_clean();
                // 抛出用户级别错误,让自定义的错误机制(phplog)能够捕获
                trigger_error($e['message']); //自己添加的
                self::halt($e);
                break;
            }
        }
    }
    

    下面是自己的错误机制

        public static function phplog($errno, $errstr = null, $errfile = null, $errline= null) {
            if($errstr === null) {                                                                                          //异常
                $backtrace = array(
                    'logType'            => 'exception',
                    'environment'        => array(
                        'code'           => $errno->getCode(),                                                              //异常代码
                        'message'        => $errno->getMessage(),                                                        //异常消息
                        'file'           => $errno->getFile(),                                                              //异常文件
                        'line'           => $errno->getLine(),                                                              //异常行
                        'debugBacktrace' => $errno->getTrace()                                                              //异常追踪
                    )
                );
            } else if( error_reporting() ) {                                                                                //常规错误
                $backtrace = array(
                    'logType'            =>'error',
                    'environment'        => array(
                        'code'           => $errno,
                        'message'        => $errstr,
                        'file'           => $errfile,
                        'line'           => $errline,
                        'debugBacktrace' => debug_backtrace()                                                               //错误回溯
                    )
                );
            } else {                                                                                                        //"@"错误
                return ;
            }
            $index = iconv('UTF-8', 'UTF-8//IGNORE', $index = &$backtrace['environment']['message']);                       //移除无效字符
            self::formatLog($backtrace);                                                                                    //格式化日志
    
            $errorLevel = array(                                                                                            //输出日志信息
                0     => 'Exception',                   //异常
                1     => 'E_ERROR',                     //致命的运行时错误。错误无法恢复。脚本的执行被中断。
                2     => 'E_WARNING',                   //非致命的运行时错误。脚本的执行不会中断。
                4     => 'E_PARSE',                     //编译时语法解析错误。解析错误只应该由解析器生成。
                8     => 'E_NOTICE',                    //运行时提示。可能是错误,也可能在正常运行脚本时发生。
                16    => 'E_CORE_ERROR',                //由 PHP 内部生成的错误。
                32    => 'E_CORE_WARNING',              //由 PHP 内部生成的警告。
                64    => 'E_COMPILE_ERROR',             //由 Zend 脚本引擎内部生成的错误。
                128   => 'E_COMPILE_WARNING',           //由 Zend 脚本引擎内部生成的警告。
                256   => 'E_USER_ERROR',                //由于调用 trigger_error() 函数生成的运行时错误。
                512   => 'E_USER_WARNING',              //由于调用 trigger_error() 函数生成的运行时警告。
                1024  => 'E_USER_NOTICE',               //由于调用 trigger_error() 函数生成的运行时提示。
                2048  => 'E_STRICT',                    //运行时提示。对增强代码的互用性和兼容性有益。
                4096  => 'E_RECOVERABLE_ERROR',         //可捕获的致命错误。
                8192  => 'E_DEPRECATED',                //运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。
                16384 => 'E_USER_DEPRECATED',           //用户产少的警告信息。
                30719 => 'E_ALL',                       //所有的错误和警告,除了 E_STRICT。
            );
            $temp = htmlentities($index, ENT_QUOTES, 'UTF-8');
            self::writeLog($backtrace, 'php', "{$errorLevel[$backtrace['environment']['code']]} : \"
    {$temp}
    \" in {$backtrace['environment']['file']} on line {$backtrace['environment']['line']}. Timestamp : {$_SERVER['REQUEST_TIME']}
    "); } protected static function writelog(&$logData, $logType, $printStr) { self::$lastError['error'] = &$logData; if( APP_DEBUG ) { //debug模式 echo $printStr; //打印日志 } $logPath = RUNTIME_PATH . 'Errorlog' . date('/Y/m/d', $_SERVER['REQUEST_TIME']) . $logType; echo realpath(RUNTIME_PATH); // 结果1.D:\wamp\www\XMQZ\Runtime 结果2.D:\wamp\Apache24\Runtime is_dir($temp = dirname($logPath)) || mkdir($temp, 0777, true); @file_put_contents( $logPath, strtr(serialize($logData), array("\r\n" => ' ' . ($temp = chr(0)), "\r" => $temp, "\n" => $temp)) . "\n", FILE_APPEND | LOCK_EX ); }
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php
    上一篇:源码安装swoole扩展时make的时候报错。 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 分享PHP函数使用小工具(附代码示例)• PHP安全编码总结(经验分享)• 非常全面!PHP常见漏洞代码总结!• 一文详解PHP实现职责链设计模式(附代码示例)• php实现通过JSON RPC与go通讯(附代码)
    1/1

    PHP中文网