에러 디버깅

아래 부분을 복사해서 저장한 후 include해서 사용하시면 됩니다. 파일 3갠데요. 중요한 것은 common.php뿐입니다. 나머지 두개는 앞글에서 보여드렸던 에러를 만들어 내기 위한 파일들입니다.

testerror.php
include(‘./common.php’);
include(‘./garbage.php’);
$h = ‘test’;
foreach($h as $key=>$val) {
echo $val;
}
?>

garbage.php
$a = ‘hihi’;
$b = join(”, $a);
?>

common.php
//by hwang@yesnic.com
//error report file version 1.0
//사용후 문제점이나, 수정되었으면하는 사항이 있을 때는 메일 주시기 바랍니다.
//이 파일을 include하면, 좀더 구체적인 에러가 메일로 리포팅됩니다.

//이 파일을 무조건 include만 하면 됩니다. 고칠값은 딱 두가지인데,
//첫째는 $__err_report값이고, 둘째는 $__admin_email 값입니다.
//자세한 설명은 각 해당 부분의 주석을 참고 하시기 바랍니다.

//$__err_report
//1. ‘all’로 설정하면, 화면에도 보여주고 메일로도 에러 보고를 합니다.
//2. ‘mail’ 로 설정하면, 메일만 보냅니다.
//3. ‘show’ 로 설정하면, 화면에만 보여줍니다.
//4. ‘hide’ 에러를 무시합니다.
//이 파일을 include하기 전에 파일에 따라 설정을 바꿀 수 있게 하기 위해서 아래와 같이
//했습니다. 미리 설정을 한 후 include를 하면, 미리 설정한 값이 우선권을 가집니다.
if(empty($__err_report)) {
$__err_report = ‘show’;
}

//에러가 발생했을 때, 에러를 보고할 이메일 주소. 역시 미리 설정한 값이 우선권을 가집니다.
if(empty($__admin_email)) {
$__admin_email = “”;
}

//추가정보들.
//필요한 것들이 있으면, arr형태로 아래와 같이 추가하십시오.
$__err_array[“time”] = date(‘Y-m-d H:i:s’, time());
$__err_array[“SERVER_NAME”] = $_SERVER[“SERVER_NAME”];
$__err_array[“PHP_SELF”] = $_SERVER[“PHP_SELF”];
$__err_array[“REMOTE_ADDR”] = $_SERVER[“REMOTE_ADDR”];
$__err_array[“SESSION”] = $_SESSION;
$__err_array[“POST”] = $_POST;
$__err_array[“GET”] = $_GET;

//필요에 따라 넣으셔도 되지만, 이거 넣으면, 페이지 로딩시간이 꽤나 길어집니다.
//$__err_array[“REMOTE_HOST”] = gethostbyaddr($_SERVER[“REMOTE_ADDR”]);

//error handler와 shutdown function을 등록합니다.
set_error_handler(“_errorHandler”);
register_shutdown_function(“_funClose”);

function _funClose() {
global $__err_content;
//에러가 있을 경우에는 에러메시지를 만들어 주고 그렇지 않을 때는 프로그램이 종료됩니다.
if(isset($__err_content)) {
global $__admin_email, $__err_report, $__err_array;
$buf_arr = “

“;
//$__err_array에서 설정한 값들을 테이블로 만듭니다.
foreach($__err_array as $key=>$val) {
$buf_arr .= “

“;
}
$buf_arr .= “

“;
if(is_array($val)) {
ob_start();
echo “

";
var_dump($val);
$val = ob_get_contents();
echo "

“;
ob_end_clean();
$buf_arr .= $key . “

” . $val;
}elseif(empty($val)) {
$buf_arr .= $key . “
null“;

}else{
$buf_arr .= $key . “

” . $val;
}
$buf_arr .= “

“;
$__err_content = “

” . $__err_content. $buf_arr . “

“;

//__err_report의 값에 따라 메일을 보내거나 화면에 뿌려줍니다.
if($__err_report === ‘all’ || $__err_report === ‘mail’) {
if(!empty($__err_content)) {
mail($__admin_email, “ErrorReport”, $__err_content, “from:errorRepoter
Content-Type: text/html;charset=EUC-KRn”);
}
}
if($__err_report === ‘all’ || $__err_report === ‘show’) {
echo $__err_content;
}
}
}

function _errorHandler ($errno, $errstr, $errfile, $errline) {
global $__err_report, $__admin_email, $__err_content, $__err_array;
$__err_array[‘filename’][] = $errfile;
//$__err_report이 ‘hide’가 아닐경우, 에러 메시지를 만듭니다.
if (!($__err_report === ‘hide’)) {
$str = “

“;
switch ($errno) {
case E_NOTICE :
case E_USER_NOTICE :
$str .= “Notice: “;
break;
case E_USER_WARNING :
case E_WARNING :
$str .= “Warning: “;
break;
case E_USER_ERROR :
case E_ERROR :
$str .= “ERROR: “;
break;
default :
$str .= “Unknown Error($errno): “;
break;
}
$str .= “$errstr in $errfile on line $errline
“;
$str .= highlightFile($errfile, $errline, 5);
$str .= “

“;
$str .= “
“;
//생성된 메시지를 global변수에 저장합니다. 여러개의 에러가 있을 때를 대비하는 것입니다.
$__err_content .= $str;
}
}

function highlightFile($file, $err_line, $count)
{
$ret = ”;
$file = trim($file);
if (isset($file) && file_exists($file)){
// highlight_file로 지정된 파일을 $data값에 저장합니다.
ob_start();
highlight_file($file);
$data = ob_get_contents();
ob_end_clean();
// new line으로 각각을 구분하여 배열에 저장합니다.
$data_lines = explode(‘
‘,$data);

// 보여줄 파일의 시작 라인과 끝 라인을 지정합니다.
$from = $err_line – round($count/2);
$to = $from + $count;
if ($from < 0) {
$from = 0;
}
if ($to > count($data_lines)) {
$to = count($data_lines);
}
//지정된 라인만큼을 $ret에 저장합니다.
for ($i = $from; $i < $to; $i++) {
$k = $i + 1;
if($k==$err_line) {
$data_lines[$i] = ““.$data_lines[$i].”“;
}
$ret .= ‘

'.$k.'‘. $data_lines[$i] .”

“;
// 행의 글자수가 너무 많으면, 적당히 짤라냅니다.
if (strlen($data_lines[$i]) > 1000) {
$ret .= ‘
‘;
}
}
}
return $ret;
}

?>