php阻拦异样能够经过PHP的谬误、异样机制及其内建数'set_exception_handler'、'set_error_handler'、'register_shutdown_function' 来写。
'set_exception_handler' 函数 用于阻拦各类未捕捉的异样,而后将这些交给用户自界说的形式进行解决
'set_error_handler' 函数能够阻拦各类谬误,而后交给用户自界说的形式进行解决 (保举学习:PHP视频教程)
'register_shutdown_function' 函数是正在PHP剧本完结时挪用的函数,合营'error_get_last'能够猎取最初的致命性谬误
这个思绪大要就是把谬误、异样、致命性谬误阻拦上去,交给咱们自界说的办法进行解决,咱们分别这些谬误、异样能否致命,假如是则记载的数据库或许文件零碎,而后应用剧本不绝的扫描这些日记,发现重大谬误立刻发送邮件或发送短信进行报警
起首咱们界说谬误阻拦类,该类用于将谬误、异样阻拦上去,用咱们本人界说的解决形式进行解决,该类放正在文件名为'errorHandler.class.php'中,代码以下
/** * 文件称号:baseErrorHandler.class.php * 摘 要:谬误阻拦器父类 */ require 'errorHandlerException.class.php';//异样类 class errorHandler { public $argvs = array(); public $memoryReserveSize = 262144;//备用内存巨细 private $_memoryReserve;//备用内存 /** * 方 法:注册自界说谬误、异样阻拦器 * 参 数:void * 返 回:void */ public function register() { ini_set('display_errors', 0); set_exception_handler(array($this, 'handleException'));//截获未捕捉的异样 set_error_handler(array($this, 'handleError'));//截获各类谬误 此处切不成掉换地位 //留下备用内存 供前面阻拦致命谬误应用 $this->memoryReserveSize > 0 && $this->_memoryReserve = str_repeat('x', $this->memoryReserveSize); register_shutdown_function(array($this, 'handleFatalError'));//截获致命性谬误 } /** * 方 法:勾销自界说谬误、异样阻拦器 * 参 数:void * 返 回:void */ public function unregister() { restore_error_handler(); restore_exception_handler(); } /** * 方 法:解决截获的未捕捉的异样 * 参 数:Exception $exception * 返 回:void */ public function handleException($exception) { $this->unregister(); try { $this->logException($exception); exit(1); } catch(Exception $e) { exit(1); } } /** * 方 法:解决截获的谬误 * 参 数:int $code 谬误代码 * 参 数:string $message 谬误信息 * 参 数:string $file 谬误文件 * 参 数:int $line 谬误的行数 * 返 回:boolean */ public function handleError($code, $message, $file, $line) { //该处思维是将谬误变为异样抛出 对立交给异样解决函数进行解决 if((error_reporting() & $code) && !in_array($code, array(E_NOTICE, E_WARNING, E_USER_NOTICE, E_USER_WARNING, E_DEPRECATED))) {//此处只记载重大的谬误 关于各类WARNING NOTICE没有作解决 $exception = new errorHandlerException($message, $code, $code, $file, $line); $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); array_shift($trace);//trace的第一个元素为以后工具 移除了 foreach($trace as $frame) { if($frame['function'] == '__toString') {//假如谬误呈现正在 __toString 办法中 没有抛出任何异样 $this->handleException($exception); exit(1); } } throw $exception; } return false; } /** * 方 法:截获致命性谬误 * 参 数:void * 返 回:void */ public function handleFatalError() { unset($this->_memoryReserve);//开释内存供上面解决顺序应用 $error = error_get_last();//最初一条谬误信息 if(errorHandlerException::isFatalError($error)) {//假如是致命谬误进行解决 $exception = new errorHandlerException($error['message'], $error['type'], $error['type'], $error['file'], $error['line']); $this->logException($exception); exit(1); } } /** * 方 法:猎取效劳器IP * 参 数:void * 返 回:string */ final public function getServerIp() { $serverIp = ''; if(isset($_SERVER['SERVER_ADDR'])) { $serverIp = $_SERVER['SERVER_ADDR']; } elseif(isset($_SERVER['LOCAL_ADDR'])) { $serverIp = $_SERVER['LOCAL_ADDR']; } elseif(isset($_SERVER['HOSTNAME'])) { $serverIp = gethostbyname($_SERVER['HOSTNAME']); } else { $serverIp = getenv('SERVER_ADDR'); } return $serverIp; } /** * 方 法:猎取以后URI信息 * 参 数:void * 返 回:string $url */ public function getCurrentUri() { $uri = ''; if($_SERVER ["REMOTE_ADDR"]) {//阅读器阅读模式 $uri = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; } else {//饬令行模式 $params = $this->argvs; $uri = $params[0]; array_shift($params); for($i = 0, $len = count($params); $i < $len; $i++) { $uri .= ' ' . $params[$i]; } } return $uri; } /** * 方 法:记载异样信息 * 参 数:errorHandlerException $e 谬误异样 * 返 回:boolean 能否保留胜利 */ final public function logException($e) { $error = array( 'add_time' => time(), 'title' => errorHandlerException::getName($e->getCode()),//这里猎取用户敌对型称号 'message' => array(), 'server_ip' => $this->getServerIp(), 'code' => errorHandlerException::getLocalCode($e->getCode()),//这里为各类谬误界说一个编号以便查找 'file' => $e->getFile(), 'line' => $e->getLine(), 'url' => $this->getCurrentUri(), ); do { //$e->getFile() . ':' . $e->getLine() . ' ' . $e->getMessage() . '(' . $e->getCode() . ')' $message = (string)$e; $error['message'][] = $message; } while($e = $e->getPrevious()); $error['message'] = implode("\r\n", $error['message']); $this->logError($error); } /** * 方 法:记载异样信息 * 参 数:array $error = array( * 'time' => int, * 'title' => 'string', * 'message' => 'string', * 'code' => int, * 'server_ip' => 'string' * 'file' => 'string', * 'line' => int, * 'url' => 'string', * ); * 返 回:boolean 能否保留胜利 */ public function logError($error) { /*这里去完成若何将谬误信息记载到日记*/ } }
上述代码中,有个'errorHandlerException'类,该类放正在文件'errorHandlerException.class.php'中,该类用于将谬误转换为异样,以便记载谬误发作的文件、行号、谬误代码、谬误信息等信息,同时其办法'isFatalError'用于分别该谬误能否是致命性谬误。
以上就是php阻拦异样怎样写的具体内容,更多请存眷资源魔其它相干文章!
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
抱歉,评论功能暂时关闭!