'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阻拦非常怎样写的细致内容,更多请关注ki4网别的相干文章!